> 文档中心 > P1219八皇后题解

P1219八皇后题解

此题用于巩固紫书第七章介绍的回溯法

题意 总共有n个皇后,每个皇后不能在同一列,同一行,或者统一对角线,问有多少中放置方法,输出前三个,并输出总的方法个数

解题思路 利用回溯法

1:对每个将要放置在第cur行的皇后,将其放置在第i列

2:判断所放位置是否符合条件,(不在同一列,不在统一对角线)

3:如若符合则进行下一层的操作,cur+1,直到cur==n+1时,输出答案

代码实现

#includeusing 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;}