问题描述:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
#include<iostream>
using namespace std;
int ans;//解法数
int vis[9];//每行可放置的列
bool check(int r, int c)//检查该位置是否可行
{
for (int i = 1; i < r; i++)//检查与前面各行是否冲突
{
if (vis[i] == c)//在同一列
return false;
if (vis[i] - c == r - i || vis[i] - c == i - r)//在同一对角线
return false;
}
return true;
}
void dfs(int r)//确定第r行
{
if (r > 8)//r=9时说明前面8行都已确定无冲突
{
ans++;
//for (int i = 1; i <= 8; i++)
//{
// cout << vis[i] << " ";
//}
//cout << endl;
return;
}
for (int i = 1; i <= 8; i++)
{
if (check(r, i))
{
vis[r] = i;
dfs(r + 1);//确定r行后一行
}
}
}
void main()
{
dfs(1);//第1行开始递归
cout << ans << endl;
getchar();
return;
}