在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。
要求第一行的皇后放在指定列,问有多少种摆法?
输入格式:
第一行的皇后放的列
输出格式:
解的个数
输入样例:
在这里给出一组输入。例如:
1
输出样例:
在这里给出相应的输出。例如:
4
对于八皇后采用回溯法的方法解决
#include<bits/stdc++.h>
using namespace std;
int position[10];
bool fare[10];
int sum=0;
void backtracking(int index)
{
if(index==9)//递归边界
{
sum++;
return;
}
for(int i=1;i<=8;i++)
{
if(!fare[i])
{
bool flag= true;
for(int j=1;j<index;j++)//判断是否在其他皇后的攻击路径上
if(abs(j-index)==abs(i-position[j]))
{
flag= false;
break;
}
if(flag)//flag为true说明此点可放置皇后,继续回溯法循环
{
position[index]=i;
fare[i]= true;
backtracking(index+1);
fare[i]= false;
}
}
}
}
int main()
{
int n;
cin>>n;
position[1]=n;
fill(fare,fare+10,false);
fare[n]= true;
backtracking(2);
cout<<sum<<endl;
return 0;
}