八皇后问题
八皇后问题
#include<stdio.h> #include"windows.h" #define N 8//定义棋盘大小 int place(int k);//确定某一位置皇后放置与否,放置则返回1,反之返回0 void backtrack(int i);//主递归函数,搜索解空间中第i层子树 void chessboard();//每找到一个解,打印当前棋盘状态 static int sum;//当前已找到解的个数 static int x[N];//记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 int main(void) { backtrack(0); system("pause"); return 0; } int place(int k) { if(k==0)//首行随便放,不会冲突 return 1; for(int j = 0;j < k;j++)//从首行到当前行 { if(abs(k-j) == abs(x[j] - x[k])/* 当前行(第k行)与第j行,共对角线。行数差等于列数差 */ || (x[j] == x[k])/*当前行(第k行)与第j行,共列*/ )//判断冲突 { return 0;//冲突返回0 } } return 1; } //穷举,逐行放置,边放边校验 void backtrack(int t)//第t行 { //t == N时,算法搜索至叶节点,得到一个新的N皇后互不攻击的放置方案 if(t == N)//t==N-1是最后一次放置,t==N就是通过了 chessboard(); else for(int i= 0; i < N;i++) { x[t] = i;//假设第t行的放置位置在i if(place(t))//.校验是否冲突 { backtrack(t+1);//校验不冲突则深入下一行 } } } void chessboard()//打印结果 { printf("第%d种解法:\n",++sum); for(int i = 0;i < N;i++) { for(int j = 0;j < N;j++) if(j == x[i]) printf("@"); else printf("*"); printf("\n"); } printf("\n"); }
#include<stdio.h> #include"windows.h" #define N 8//定义棋盘大小 int place(int k);//确定某一位置皇后放置与否,放置则返回1,反之返回0 void backtrack(int i);//主递归函数,搜索解空间中第i层子树 void chessboard();//每找到一个解,打印当前棋盘状态 static int sum=0;//当前已找到解的个数 static int x[N];//记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 int main(void) { backtrack(0); system("pause"); return 0; } void backtrack(int line) { if (line==N) { chessboard(); } else { for (int i=0;i<N;i++) { x[line]=i; if (place(line)) { backtrack(line+1); } } } } int place(int line) { if (line==0) { return 1; } for (int i=0;i<line;i++) { if ( x[line]==x[i] || (line-i)==abs(x[line]-x[i]) ) { return 0; } } return 1; } void chessboard() { printf("第 %d 个解:\n",++sum); for (int i=0;i<N;i++) { for (int j=0;j<N;j++) { printf("%c",(x[i]==j)?'@':'*'); } printf("\n"); } printf("\n"); }

浙公网安备 33010602011771号