八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例.
时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题,
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。
![]()
#pragma warning(disable:4996) #include<iostream> using namespace std; int ans; bool col[8],x1[15], x2[15]; //col为列标记,x1,x2为两条对角线标记,每种对角线各15条 bool check(int r, int i) //检测是否合法 { return !col[i] && !x2[r-i+7] && !x1[r+i]; } void dps(int r) { if (r == 8) //行走到8,表示方案可行 { ans++; return; } for (int i = 0; i < 8; i++) //遍历当前行的每一列 { if (check(r, i)) { col[i] = x1[r + i] = x2[r - i + 7] = true; //对当前位置列和两对角线做上占用标记 //对于x1, 某个格子上对角线行列之和固定, 对于x2, 某个格子上对角线行列之差固定 //x2中+7是防止数组下标为负数 dps(r + 1); //遍历下一行 col[i] = x1[r + i] = x2[r - i + 7] = false; //取消当前位置列和两对角线的标记 } } } int main() { dps(0); cout << ans << endl; //输出结果 return 0; }