八皇后问题 回溯法hdu2553

5人阅读 评论(0) 收藏 举报
分类:

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
1 8 5 0
 

Sample Output
1 92 10
 

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]);
	}
}

查看评论

hdu2553(八皇后问题+打表)

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

hdu 2553 N皇后问题 (搜索)

HDU 2553 不预处理会超时。。 #include #include #include using namespace std; int map[11]; int n; int ...
  • Strokess
  • Strokess
  • 2016-03-04 11:04:30
  • 229

回溯法:八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后...
  • T_27080901
  • T_27080901
  • 2015-05-17 12:24:51
  • 4586

【算法分析】回溯法解八皇后问题(n皇后问题)

回溯法解题思路: (1)针对所给问题,定义问题的解空间;    (2)确定易于搜索的解空间结构;    (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。八皇后问题: 八...
  • sinat_33052719
  • sinat_33052719
  • 2016-05-18 21:26:05
  • 3274

hdu2553简单八皇后问题(简单深搜+回溯)

思路:每一列的所有行的情况尝试,如果该行的点符合条件,就增加一层继续搜索,然后如果能够顺利放8点次数加1; 注意:结果出来要打在一张表里,否则每次都去尝试的话会超时 代码如下: #include #...
  • calculate23
  • calculate23
  • 2017-08-15 13:32:25
  • 193

回溯法求解八皇后问题

问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线...
  • gao1440156051
  • gao1440156051
  • 2014-03-07 09:52:27
  • 7972

用回溯法解决八皇后问题的C语言程序

#include   #include   int col[9]={0},a[9];   int b[17],c[17];   main()   {   int m...
  • hld_hepeng
  • hld_hepeng
  • 2012-05-09 15:30:49
  • 1700

八皇后问题之回溯算法实现&lt;java实现&gt;

 Code: package algorithm ;   public class Empress {              private int n ; //皇后个数 ...
  • pengchengjiji
  • pengchengjiji
  • 2010-11-29 13:52:00
  • 9214

[回溯法]八皇后问题的递归与非递归算法

八皇后的问题非常有名,初次理解可能稍有难度,不过多看书,看博客和代码,几遍下来,也基本清晰。首先不用想初始的情况,先假设前面已经排列好了几个皇后,即将排列下一个皇后。依次遍历八个位置,然后与之前的进行...
  • htx931005
  • htx931005
  • 2015-12-20 14:02:45
  • 995

八皇后之回溯法(C语言版)

八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即...
  • Mary19920410
  • Mary19920410
  • 2017-03-18 13:33:03
  • 1635
    个人资料
    持之以恒
    等级:
    访问量: 9689
    积分: 1487
    排名: 3万+
    最新评论