八皇后问题 回溯法hdu2553

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu121380/article/details/79957694

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 29994    Accepted Submission(s): 13085


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

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input
1850
 

Sample Output
19210
 

Author
cgf
 

Source

2008 HZNU Programming Contest

解题思路就不说了 代码中说明主意点。。。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<map>
#include<list>
#include<stack>
#include<set>
using namespace std;

int n,tot=0,a[15],b[15],row;

void dfs(int row)//递归搜索可行解,回溯法
{
	if(row==n)//当row=n时,说明每一行的皇后都不冲突,即为可行解
	{
		tot++;
		return;
	}
	else 
	{
		for(int i=0; i<n; i++)
		{
			int flag=1;
			a[row]=i; //尝试把第row行的皇后放在i列上
			for(int j=0; j<row; j++) //检验是否与前面已放好的皇后冲突
			{
				if(a[row]==a[j]||a[row]-row==a[j]-j||a[row]+row==a[j]+j)//注意点,也是理解点
				{//判断之前的列有没有放过,判断对角线的位置有没有放皇后,对角线没什么公式,自己理解。
					flag=0;
					break;//跳出最内层循环如果冲突,停止搜索,返回上一级递归回溯。回溯法高效的关键
				}
			}
			if(flag)
			{
				dfs(row+1);//往下面一行继续搜索
			}
		}
	}
}

int main()
{
	for(int i=1; i<=10; i++)//之前就是没有这一步预处理,所以TLE了 TT
	{
		tot=0;
		n=i;
		dfs(0);
		b[i]=tot;
	}
	while(~scanf("%d",&n),n)
	{
		printf("%d\n",b[n]);
	}
}


回溯法和栈来八皇后问题

04-14

在数据结构课程设计中,本人急求解决八皇后问题。rn 课程设计要求如下:rn 在实际应用中,有相当一类问题需要找出它的解集合,或者要求找出某些约束条件rn下的最优解。求解时经常使用一种称为回溯的方法来解决。所谓回溯就是走回头路,该rn方法是在一定的约束条件下试探地搜索前进,若前进中受阻,则回头另择通路继续搜索。rn为了能够沿着原路逆序回退,需用栈来保存曾经到达的每一个状态,栈顶的状态即为回rn退的第一站,因此回溯法均可利用栈来实现。而解决八皇后问题就是利用回溯法和栈来rn实现的。rnrn 八皇后问题是在8x8的国际象棋棋盘上,安放8个皇后,要求没有一个皇后能够“吃rn掉”任何其他一个皇后,即没有两个或两个以上的皇后占据棋盘上的同一行、同一列或rn同一条对角线。rn 八皇后在棋盘上分布的各种可能的格局,其数目非常大,约等于232种,但是,可以rn将一些明显不满足问题要求的格局排除掉。由于任意两个皇后不能同行,即每一行只能rn放置一个皇后,因此将第i个皇后放置在第i行上。这样在放置第i个皇后时,只要考虑它rn 与前i一1个皇后处于不同列和不同对角线位置上即可。因此,其算法基本思想如下:rn 从第1行起逐行放置皇后,每放置一个皇后均需要依次对第1,2,…,8列进行试探,rn 并尽可能取小的列数。若当前试探的列位置是安全的,即不与已放置的其他皇后冲突,rn 则将该行的列位置保存在栈中,然后继续在下一行上寻找安全位置;若当前试探的列位rn 置不安全,则用下一列进行试探,当8列位置试探完毕都未找到安全位置时,就退栈回rn 溯到上一行,修改栈顶保存的皇后位置,然后继续试探。rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试