问题:简单概括为:每个皇后的*范围如下图红线标注所示,也就是横纵轴、两条对角线 。在一个皇后的*范围内,就不能再出现其他皇后了。
两种方法,第一种方法只用了queen这个数组来表示八个皇后所在的行和列。
第二种方法效率更加高一点,用到了vis数组来检查列和对角线有没有其他的皇后
#include <iostream> #include <algorithm> using namespace std; #define MaxSize 100 int n, count_; int queen[MaxSize]; int vis[3][MaxSize]={0}; void search_1(int cur){ if(cur == n){ count_++; printf("NO.%d\n", count_); for(int i=0; i<n; ++i){ for(int j=0; j<n; ++j){ if(queen[i] == j) printf("%5d", 1); else printf("%5d", 0); } printf("\n"); } } else{ for(int i=0; i<n; ++i){ queen[cur] = i; //把皇后放在第cur行的第i列 bool ok = true; for(int j=0; j<cur; ++j) if(queen[cur] == queen[j] || cur-queen[cur] == j-queen[j] || cur+queen[cur] == j+queen[j]){ ok = false; break; } if(ok) search_1(cur+1); } } } void search_2(int cur){ if(cur == n){ count_++; printf("NO.%d\n", count_); for(int i=0; i<n; ++i){ for(int j=0; j<n; ++j){ if(queen[i] == j) printf("%5d", 1); else printf("%5d", 0); } printf("\n"); } } else for(int col=0; col<n; ++col){ //vis[0][]表示的现在的列有没有其他皇后,vis[1][]和vis[2][]表示现在的对角线有没有其他皇后 if(!vis[0][col] && !vis[1][cur+col] && !vis[2][n+cur-col]){ queen[cur] = col; vis[0][col] = vis[1][cur+col] = vis[2][n+cur-col] = 1; search_2(cur+1); vis[0][col] = vis[1][cur+col] = vis[2][n+cur-col] = 0; } } } int main(){ cin>>n; //search_1(0); search_2(0); return 0; }