鱼C论坛

 找回密码
 立即注册
查看: 8378|回复: 28

[技术交流] 自己写的八皇后算法

[复制链接]
发表于 2013-3-9 22:10:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
快两年没有来鱼C学编程了,当初看小甲鱼的C语言和汇编教程(汇编基本全忘了。。。),
不过经常过来也就是打打酱油,今天微博看到小甲鱼的数据结构八皇后教程。
想起当初学算法的时候,没有完成这道经典题目,于是就试着写了个。
在小甲鱼的代码基础上对检测冲突和棋盘的空间复杂度做了点优化。。。

很久没有用C/C++写代码,大一大二学的是C++
去年升大三开始学校学的是Java,很久没用指针,
不知道写的好不好,轻拍O(∩_∩)O~
  1. #include <stdio.h>

  2. #define CHESS_ROW                8                //棋盘行数
  3. #define        CHESS_COLUMN        8                //棋盘列数

  4. //清除row+1行的棋子
  5. void clearRow(int row, int ch[][CHESS_COLUMN]) {
  6.         int j;
  7.         for (j = 0; j < CHESS_COLUMN; j++)
  8.                 ch[row][j] = 0;
  9. }

  10. //判断是否有冲突,有冲突返回1,没有返回0
  11. /*
  12. * 由于棋子是由上往下一行行排列的,
  13. * 所以没有必要判断下半部分的棋盘
  14. * 是否有冲突(还没有摆棋子),
  15. * 只需要判断上半列,左上,右上三个方向。
  16. * 即每次判断上一行的(row-1,col),(row-1,col-1)和(row-1,col+1)
  17. * 三个位置即可
  18. */
  19. int isConflict(const int row, const int col, const int ch[][CHESS_COLUMN]) {
  20.         int i;
  21.         int offset = 1;                //用于判断左右两边的偏移量
  22.         for (i = row - 1; i >= 0; i--, offset++) {
  23.                
  24.                 if ( ch[i][col] != 0) {
  25.                         return 1;                //上半列有冲突
  26.                 }
  27.                
  28.                 if ( (col - offset) >= 0) {
  29.                         if ( ch[i][col - offset] != 0) {        //判断是否越界
  30.                                 return 1;        //左上有冲突
  31.                         }
  32.                 }

  33.                 if ( (col + offset) < CHESS_COLUMN) {        //判断是否越界
  34.                         if ( ch[i][col + offset] != 0) {
  35.                                 return 1;        //右上有冲突
  36.                         }
  37.                 }
  38.         }

  39.         return 0;                                //没有冲突返回0
  40. }

  41. //打印棋盘
  42. void printChess(int ch[][CHESS_COLUMN] ) {
  43.         int i, j;
  44.         static int count = 1;
  45.         printf("第%d种情况:\n", count);
  46.         for (i = 0; i < CHESS_ROW; i++) {
  47.                 for (j = 0; j < CHESS_COLUMN; j++) {
  48.                         printf("%d ",ch[i][j]);
  49.                 }
  50.                 printf("\n");
  51.         }
  52.         printf("\n");
  53.         count++;
  54. }

  55. /*
  56. * 八皇后递归算法,只使用了一个棋盘。
  57. * 每次摆放到该行的最后一列时,
  58. * 在返回上一行前先清空上一行上面
  59. * 摆放的棋子。则不需要每次调换都
  60. * 生成棋盘记录当前棋盘状况。
  61. */
  62. void eightQueen(const int row, int ch[][CHESS_COLUMN]) {
  63.         int j;

  64.         if (row == 8) {                //第八行完成,打印棋盘
  65.                 printChess(ch);
  66.                 clearRow(row - 1, ch);        //清空最后一行,以便下一轮计算

  67.                 return;
  68.         }

  69.         for (j = 0; j < CHESS_COLUMN; j++) {
  70.                 if ( !isConflict(row, j, ch)) {        //检测没有冲突,递归调用
  71.                         ch[row][j] = 1;
  72.                         eightQueen(row + 1, ch);
  73.                 }
  74.         }
  75.         if (row > 0) {                //没有到首行,则清空上一行
  76.                 clearRow(row - 1, ch);
  77.         }
  78. }

  79. int main() {
  80.         int chess[CHESS_ROW][CHESS_COLUMN];
  81.         int i, j;
  82.         //初始化棋盘
  83.         for (i = 0; i < CHESS_ROW; i++) {
  84.                 for (j = 0; j < CHESS_COLUMN; j++) {
  85.                         chess[i][j] = 0;
  86.                 }
  87.         }

  88.         eightQueen(0, chess);
  89.         return 0;
  90. }
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-10 00:00:56 | 显示全部楼层
写的很好  向你学习
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-8 16:56:35 | 显示全部楼层
写的很好啊   
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-15 22:34:39 | 显示全部楼层
淡定,淡定,淡定……
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-7-2 21:37:55 | 显示全部楼层
看帖,回复支持下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-2 23:42:52 | 显示全部楼层
看看老帖,支持下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-3 16:16:56 | 显示全部楼层
我想说,没人回帖吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-3 17:49:49 | 显示全部楼层
看帖,支持下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-3 19:45:59 | 显示全部楼层
看看,回复支持下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-4 20:51:08 | 显示全部楼层
再看看,支持下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-9 10:24:48 | 显示全部楼层
八皇后问题是经典算法·······
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-10 17:07:29 | 显示全部楼层
学习了!:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-15 08:29:44 | 显示全部楼层
写的不错,学习了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-9 09:16:59 | 显示全部楼层
写得挺好的 怎么就没人回复呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-9 23:23:25 | 显示全部楼层
多谢楼主分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-28 23:26:22 From FishC Mobile | 显示全部楼层
感谢分享,看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-28 12:26:40 | 显示全部楼层
感谢楼主无私奉献!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 12:39:21 | 显示全部楼层
八皇后问题,想起当年学习往事,哎,不堪回首
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-3 17:50:20 | 显示全部楼层
确实是值得思考的一个问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-3 21:40:50 | 显示全部楼层
呵呵  不错不错,。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 06:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表