#C++初学记录(N皇后#回溯递归)

<font size=5 face"微软雅黑">N皇后Problem Description
<font size=4 face"微软雅黑">在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

<font size=5 face"微软雅黑">Input
<font size=4 face"微软雅黑">共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

<font size=5 face"微软雅黑">Output
<font size=4 face"微软雅黑">共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

<font size=5 face"微软雅黑">Sample Input
<font size=4 face"微软雅黑">1
8
5
0

<font size=5 face"微软雅黑">Sample Output
<font size=4 face"微软雅黑">1
92
10

<font size=5 face"微软雅黑">正确代码(暴力解)

#include<iostream>
#include<cmath> 
using namespace std;
int n,sum;
int que[100];
void quee(int k)
{
	if(k==n)
	{
		sum++;
	 } 
	for(int i=0;i<n;i++)//尝试摆放第k行皇后的位置。 这里是第i列。 
	{
		int j;
		for(j=0;j<k;j++)//和已经摆好的k个皇后比较,查看是否冲突。 
		{
		 if(que[j]==i||abs(que[j]-i)==abs(k-j))//列的差和行的差绝对值相同则说明他们能互相吃到。 
		 break;
		}
		if(j==k){
			que[k]=i;//将第k个皇后摆放在位置i。k->行,i->列。 
			quee(k+1);
		} 
	}
}
int main()
{
	cin>>n;
	quee(0);
	cout<<sum;
}

<font size=5 face"微软雅黑">代码理解
<font size=4 face"微软雅黑">解决n皇后问题的主要思路是如何摆放皇后的位置使八个皇后都不会有生命危险,八皇后的核心代码是如何判断皇后的摆放位置,即

		 if(que[j]==i||abs(que[j]-i)==abs(k-j))//列的差和行的差绝对值相同则说明他们能互相吃到。 
		 break;

这一判断,其中前者是判断皇后是否在同一列,后者是判断皇后是否在对角线上,对角线的判断是两个皇后之间的行之差是否等于列之差,若相等则在对角线上,八皇后的回溯递归问题比较抽象,他使用两层嵌套for循环进行行和列的判断,第i行,第j列,在for循环外面的

	if(k==n)
	{
		sum++;
	 } 

并不会显得不能理解,因为在一层一层递归之后,计算机最终找到了其中之一的安置方法,这是由n个递归进行的判断,当第n个递归表示第n个皇后可以安放后,第n+1次递归就会进行这个if判断,然后sum+1,之后递归回溯到j次循环内继续进行循环,之后j循环完毕,继续回溯到i次循环。

posted @ 2019-05-27 21:16  十魇  阅读(332)  评论(0编辑  收藏  举报
GenerateContentList