此题用于巩固紫书第七章介绍的回溯法
题意 总共有n个皇后,每个皇后不能在同一列,同一行,或者统一对角线,问有多少中放置方法,输出前三个,并输出总的方法个数
解题思路 利用回溯法
1:对每个将要放置在第cur行的皇后,将其放置在第i列
2:判断所放位置是否符合条件,(不在同一列,不在统一对角线)
3:如若符合则进行下一层的操作,cur+1,直到cur==n+1时,输出答案
代码实现
#include<iostream>
using namespace std;
int queen[14];//这是解
bool visit[3][40];
//第一行是判断某一行是否有皇后了
//第二行和第三行判断在某一条对角线上是否有皇后了
int ans=0;//有几个
void solve(int cur,int n);//为什么会多了
int main()
{
int n;
scanf("%d",&n);
solve(1,n);//这是现在需要放置的皇后
printf("%d\n",ans);
}
void solve(int cur,int n)
{
if(cur==n+1)
{
ans++;
if(ans<=3)//输出前三个
{
for(int i=1;i<=n;i++)printf("%d ",queen[i]);
printf("\n");
}
return;
}
for(int i=1;i<=n;i++)
{
//是否在同一对角线,如果不明白,建议画个图
if(!visit[0][i]&&!visit[1][i+cur]&&!visit[2][i-cur+n])
{
queen[cur]=i;
visit[0][i]=visit[1][i+cur]=visit[2][i-cur+n]=1;
solve(cur+1,n);
visit[0][i]=visit[1][i+cur]=visit[2][i-cur+n]=0;
}
}
return;
}
版权声明:本文为nicole_coco原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。