杭电 2553 N皇后问题

http://acm.hdu.edu.cn/showproblem.php?pid=2553

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 8077    Accepted Submission(s): 3603

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

 这个问题终于理解啦!还记得第一次接触这个问题时一直在逃避,觉得感觉起来好麻烦,不想去思考,在昨天经过队友不厌其烦特别耐心的给我讲解了这个问题的思路以及解决方法之后感觉豁然开朗啊!

这个问题应用了深搜,回溯的思想,第一个是很好放的,后面的就得慢慢来的,后面若碰到了不能放的就调整上一层,直到全部搜完。*-*

下面是我理解这个问题的代码,仅用于理解:

#include<iostream>
#include<string.h>
int tot,c[20],n;

void search(int cur)//cur控制行
{
	int i,j;
	if(cur==n)
		tot++;
	else
		for(i=0;i<n;i++)
		{
			int ok=1;
			c[cur]=i;//i控制列;
			for(j=0;j<cur;j++)
				if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])//判断行列,左右对角是否符合条件;
				{
					ok=0;
					break;
				}//不合格跳出到i++;
				if(ok)
					search(cur+1);
		}
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)break;
        tot=0;
    	search(0);//从0行开始搜索。
	    printf("%d\n",tot);
	}
	return 0;
}

这个代码提交的时候时间不合格,要打表。。。

AC代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int vis[20][20],w[12];
int n,tot;
void dfs(int x){
    int i;
    if(x == n) tot++;
    else{
        for(i=0;i<n;i++){
            if(!vis[0][i] && !vis[1][x+i] && !vis[2][x-i+n])//不同行列对角;
			{
                vis[0][i]=vis[1][x+i]=vis[2][x-i+n]=1;//修改全局变量;
                dfs(x+1);
                vis[0][i]=vis[1][x+i]=vis[2][x-i+n]=0;//改回来;
            }
        }
    }
}
int main(){
    int j,a;
    for(j=1;j<=10;j++)//打表,控制在1到10;
	{
        tot=0;
        memset(vis,0,sizeof(vis));
        n=j;
        dfs(0);
        w[j]=tot;
    }
    while(scanf("%d",&a) && a)
	{
        printf("%d\n",w[a]);
    }
    return 0;
}

杭电 2553 N皇后问题,布布扣,bubuko.com

时间: 2024-08-08 05:16:27

杭电 2553 N皇后问题的相关文章

N皇后问题 HDU 杭电2553【递归回溯】

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 #inc

杭电ACM题目分类

杭电ACM题目分类 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028. 1029.1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092. 1093.1094.1095.1096.1097.1098.1106.1108.1157.1163.1164.1170.1194.1196. 1197.1201.1202.1205.1219.1234.123

杭电 HDU 1164 Eddy&#39;s research I

Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7117    Accepted Submission(s): 4268 Problem Description Eddy's interest is very extensive, recently  he is interested in prime

hdu 1016 Prime Ring Problem DFS解法 纪念我在杭电的第一百题

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29577    Accepted Submission(s): 13188 Problem Description A ring is compose of n circles as shown in diagram. Put natural num

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

一个人的旅行 HDU杭电2066【dijkstra算法】

http://acm.hdu.edu.cn/showproblem.php?pid=2066 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不

杭电1162--Eddy&#39;s picture(Prim()算法)

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8070    Accepted Submission(s): 4084 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to b

杭电1276--士兵队列训练问题

士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4605    Accepted Submission(s): 2148 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行

杭电1272 并查集找环+判断连通

杭电1272 并查集找环+判断连通 E - E Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B