搜索 八皇后问题
八皇后问题:
问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
搜索经典题。
难的点在于想出对角线的标记。
首先在棋盘上建立坐标(i,j);
可以放斜率为正(从左下到右上的直线 /
发现从左上到右下斜线排列的顺序,可以用 i + j 进行标记
0,1,2,3,4,5,6,7,8,9...12,13
那么类似的,我们可以推出 i - j
7.6,5,4,3,2,1,0,-1 .. -6,-7
#include <iostream> using namespace std; int ans = 0; const int MAXN = 8; bool row[MAXN],x1[MAXN*2],x2[MAXN*2]; bool check(int c,int i){//检测是否在对角线以及这行有皇后 return !row[i] && !x1[c+i] && !x2[c-i+MAXN]; } void dfs(int c){//在c行i列放皇后 if(c == 8){ ans++; return; } for(int i=0;i<8;++i){ if(check(c,i)){ row[i] = x1[c+i] = x2[c-i+MAXN] = true; dfs(c+1); row[i] = x1[c+i] = x2[c-i+MAXN] = false; } } } int main() { dfs(0); cout << ans << endl; return 0; }