八皇后问题 递归解法
2016-02-26 19:08
661 查看
本文简单讲解了八皇后递归解法, 比较易懂
直接看代码:
运行结果(92种解法):
直接看代码:
#include <stdio.h> #define NUM_QUEUE 8 #define TRUE 1 #define FALSE 0 // 记录解法数 int gCount = 0; // 使用二维数组定义棋盘 int gChessBoard[NUM_QUEUE][NUM_QUEUE] = { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, }; /* * PrintChessBoard * ------------------------------------------- * 打印棋盘局面 */ void PrintChessBoard() { int i, j; printf("\nPrint Chess board ... Start \n"); for (i = 0; i < NUM_QUEUE; ++i) { for (j = 0; j < NUM_QUEUE; ++j) { printf("%d ", gChessBoard[i][j]); } printf("\n"); } printf("\nPrint Chess board ... End \n"); } /* * IsPlace * @row 棋盘行号(0 - 7) * @col 棋盘列号(0 - 7) * ------------------------------------------- * 判断(row,col) 位置是否可以落子 */ int IsPlace(int row, int col) { // 判断 同一行 是否有棋子 for (int i = 0; i < col; i++) { if (gChessBoard[row][i] == 1) { return FALSE; } } // 判断 同一列 是否有棋子 for (int i = 0; i < row; i++) { if (gChessBoard[i][col] == 1) { return FALSE; } } // 判断 左上和右上 对角线 是否有棋子 int i, j; for (i = row - 1, j = col - 1; (i >= 0) && (j >= 0); i--, j--) { if (gChessBoard[i][j] == 1) { return FALSE; } } for (i = row - 1, j = col + 1; (i >= 0) && (j < NUM_QUEUE); i--, j++) { if (gChessBoard[i][j] == 1) { return FALSE; } } return TRUE; } /* * PlaceQueue * @row 棋盘行号(0 - 7) * ------------------------------------------- * 递归逐行放置棋子 */ void PlaceQueue(int row) { // 如果递归行号到 8 行 // 递归结束 // ** 不能在 PlaceQueue(row + 1); 之前 // ** 判断递归到 7 行结束, 否则 // ** 不能到 7 行不能完全回溯 if (row == NUM_QUEUE) { PrintChessBoard(); gCount++; return ; } for (int i = 0; i < NUM_QUEUE; i++) { if (IsPlace(row, i)) { gChessBoard[row][i] = 1; // 放置棋子 PlaceQueue(row + 1); // ** 不能在之前 返回 // ** 否则无法在 7 行回溯 gChessBoard[row][i] = 0; // 回溯,清除此处棋子 } } } /* * EightQueue() * ------------------------------------------- * 八皇后包装函数 */ void EightQueue() { PlaceQueue(0); } /* * main * ------------------------------------------- * 主函数,最后打印解法数 */ int main(int argc, char** argv) { EightQueue(); printf("八皇后的解法数: %d\n", gCount); getchar(); return 0; }
运行结果(92种解法):
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- javascript递归回溯法解八皇后问题
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)