#include <iostream> #define NUM 8 using namespace std; typedef struct Empress { int x; int y; int flag; bool IfEmp; }EMP; void InitChessboard(EMP Chessboard[9][9]); void InitEmpress(EMP Empress[]); void ReconsChessboard(EMP Chessboard[9][9],EMP Empress[],int n); void SetFlag(EMP Chessboard[9][9],EMP Empress[],int n); bool FlagSearch(EMP Chessboard[9][9],EMP Empress[],int n,int x,int y); void OutPutResult(FILE *fp,EMP Chessboard[9][9],EMP Empress[],int count); int main() { FILE *fp=NULL; EMP Chessboard[9][9]; EMP Empress[9]; InitChessboard(Chessboard); InitEmpress(Empress); int n=1; int count=1; int x=1,y=1; if((fp=fopen("EightEmpress.txt","w"))==NULL) { printf("打开EightEmpress.txt失败!/n"); exit(1); } fprintf(fp,"八皇后问题输出结果:/n"); fprintf(fp,"●表示皇后位置 ○表示无子/n/n"); cout <<"开始运算八皇后问题求解.../n"; while(count<=92) { if(FlagSearch(Chessboard,Empress,n,x,y)) { SetFlag(Chessboard,Empress,n); if(n==8) { OutPutResult(fp,Chessboard,Empress,count); cout <<"已求出解 "<<count<<" 个解/n"; count++; ReconsChessboard(Chessboard,Empress,n); x=Empress[n].x; y=Empress[n].y; } else { x=Empress[n].x; y=Empress[n].y; n++; } } else { n--; ReconsChessboard(Chessboard,Empress,n); x=Empress[n].x; y=Empress[n].y; } } cout <<"/n求解完成一共求出 "<<count-1<<" 个解/n"; cout <<"求解结果已保存到 EightEmpress.txt 文件中/n"; fclose(fp); system("start EightEmpress.txt"); system("pause"); return 0; } void InitChessboard(EMP Chessboard[9][9]) { for(int i=0;i<=8;i++) { Chessboard[0][i].x=0; Chessboard[0][i].y=i; Chessboard[0][i].IfEmp=false; Chessboard[0][i].flag=1; Chessboard[i][0].x=i; Chessboard[i][0].y=0; Chessboard[i][0].IfEmp=false; Chessboard[i][0].flag=1; } for(int i=1;i<=8;i++) for(int j=1;j<=8;j++) { Chessboard[i][j].x=i; Chessboard[i][j].y=j; Chessboard[i][j].IfEmp=false; Chessboard[i][j].flag=0; } } void InitEmpress(EMP Empress[]) { for(int i=0;i<=8;i++) { Empress[i].x=0; Empress[i].y=0; Empress[i].IfEmp=false; Empress[i].flag=0; } } void ReconsChessboard(EMP Chessboard[9][9],EMP Empress[],int n) { InitChessboard(Chessboard); for(int i=1;i<n;i++) { SetFlag(Chessboard,Empress,i); Chessboard[Empress[i].x][Empress[i].y].IfEmp=true; } Chessboard[Empress[n].x][Empress[n].y].flag=1; } void SetFlag(EMP Chessboard[9][9],EMP Empress[],int n) { int i,j; i=Empress[n].x; j=Empress[n].y; for(int k=1;k<=8;k++) { Chessboard[i][k].flag=1; Chessboard[k][j].flag=1; } while(i!=1&&j!=1) { i--; j--; Chessboard[i][j].flag=1; } i=Empress[n].x; j=Empress[n].y; while(i!=8&&j!=8) { i++; j++; Chessboard[i][j].flag=1; } i=Empress[n].x; j=Empress[n].y; while(i!=8&&j!=1) { i++; j--; Chessboard[i][j].flag=1; } i=Empress[n].x; j=Empress[n].y; while(i!=1&&j!=8) { i--; j++; Chessboard[i][j].flag=1; } } bool FlagSearch(EMP Chessboard[9][9],EMP Empress[],int n,int x,int y) { EMP *p; for(p=&Chessboard[x][y];p<=&Chessboard[8][8];p++) { if(p->flag==0) { p->IfEmp=true; Empress[n].IfEmp=true; Empress[n].flag=1; Empress[n].x=p->x; Empress[n].y=p->y; return true; } } return false; } void OutPutResult(FILE *fp,EMP Chessboard[9][9],EMP Empress[],int count) { fprintf(fp,"第 %d 种情况:/n/n",count); for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { if(Chessboard[i][j].IfEmp) { fprintf(fp,"●"); } else { fprintf(fp,"○"); } } fprintf(fp,"/n"); } fprintf(fp,"/n/n"); }