八皇后问题
一个8*8方盘,每个皇后不能再同一行、同一列、同一对角线上,我们可以忽略行(即不保存行,不申请二维数组),直接从第一行算,然后算第二行的皇后,maze[i] = j; 代表着第i行第j列有着一个皇后,我们直接从行开始算,每次判断是否有不符合规则的皇后,因为不计算行,所以 只需判断
(x == j)|| (maze[x] == maze[j])|| ((x - j) == (maze[x] - maze[j])) || ((j - x) == (maze[x] - maze[j]))满足上面条件则不符合
代码如下:
#include<iostream>#include <cstring>using namespace std;const int N = 8; int maze[12], count = 0;void PRint(){ for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(maze[i] == j) { cout << "1"; //<< "/t"; } else { cout << "0"; //<< "/t"; } } cout << endl; } cout << endl; } void search(int x){ if(N == x) { print(); count++; return ; } int Is_success; for(int i=0;i<N;i++) //列计算 { maze[x] = i; //第X行第I列 Is_success = 1; for(int j = 0; j < x; j++) { if((x == j)// || AND && 低于关系运算符 || (maze[x] == maze[j])// ! 高于关系运算符 || ((x - j) == (maze[x] - maze[j])) || ((j - x) == (maze[x] - maze[j]))) { Is_success = 0; break; } } if(Is_success) { search(x+1); } }}int main(){ search(0); cout << "total = " << count << endl; return 0; }运行结果,总共92种解法
新闻热点
疑难解答