P1219八皇后题解

  • Post author:
  • Post category:其他


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

题意 总共有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 版权协议,转载请附上原文出处链接和本声明。