#include <iostream> #include <fstream> #include <string.h> /** 八皇后问题递归方法实现 */ using namespace std; ofstream file; //用以计数计算结果的数目 int count = 1; /** 打印的棋盘其中打印1的位置是皇后的位置,0空位。 这里因为在控制台看不到全部,所有做了在文件中输出所有的解 */ int print_Chessboard(int chessboard[][8]) { file.open("data.txt",ofstream::app|ofstream::out); file<<"答案:"<<count<<endl; cout<<"答案:"<<count<<endl; count++; for(int row = 0; row < 8;row++) { for(int column = 0;column<8;column++) { file<<chessboard[row][column]<<" "; cout<<chessboard[row][column]<<" "; } file<<endl; cout<<endl; } file<<endl<<endl; cout<<endl<<endl; file.close(); } /** 参数一将棋盘信息传入函数, 参数二将要放入的皇后的行数传入 参数三将要放入的皇后的列数传入 若皇后放入成功则返回1,若失败则返回0 */ int check_Chessboard(int chessboard[][8],int row,int column) { //1、首先检查行数和列数是否已经超出棋盘的局限,若超出了 //说明前边已经都符合位置,此时返回成功系数1 if(row>=8) { //打印结果 print_Chessboard(chessboard); return 1; } //2、检查在这一列上是否有皇后,正上方 for(int i = 0; i < row;i++) { if(chessboard[i][column]==1) return 0; } //3、检查在左上和右上斜对角上是否有皇后 //左上45度 for(int i=row-1,j=column-1;i>=0&&j>=0;i--,j--) { if(chessboard[i][j]==1) return 0; } //右上45度 for(int i=row-1,j=column+1;i>=0&&j<8;i--,j++) { if(chessboard[i][j]==1) return 0; } //到这里说明摆放成功 //摆放成功后把这个位置标记为1 chessboard[row][column]=1; //循环的检查下一行的没一个位置 for(int i = 0; i < 8; i++) { if(check_Chessboard(chessboard,row+1,i)==0) continue; else break; } //若没有摆放成功就返回0;此时需要把该位置重新置为0 chessboard[row][column]=0; return 0; } //主调函数 int main() { int chessboard[8][8]; for(int i = 0; i < 8; i++) { memset(chessboard,0,sizeof(chessboard)); check_Chessboard(chessboard,0,i); } return 0; }
以下是运行结果,答案共有92中摆放方法
![](https://ucc.alicdn.com/qkixv43wa7m4w/developer-article566780/20241020/646af577854d491f957babbf1e5f1155.gif)
本文转自NewPanderKing51CTO博客,原文链接:
http://www.cnblogs.com/newpanderking/archive/2012/08/23/2652083.html
,如需转载请自行联系原作者