您的位置:首页 > 其它

HDU——2553 N皇后问题(dfs打表)

2018-04-03 20:37 1181 查看

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

解题思路:

很经典的一道题,这道题注意点在于,多组测试数据,如果每次都遍历一遍会超时 , 好在

N <=10,所以事先打表 , 之后直接输出结果就可以了。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int queen[10];
int n;
int sum = 0;

int record[10] = {0};
int check(int row){
int i;
for(i = 0 ; i <= row -1 ; i++){
if(queen[i] == queen[row] || abs(queen[i] - queen[row]) == abs(i - row))
return 0;
/*queen[i] == queen[row] 判断是否在同一列上
abs(queen[i] - queen[row]) == abs(i - row)  判断是否在对角线上*/
}
return 1;
}
void dfs(int row){
int i;
for( i = 0 ; i < n ; i ++){
queen[row] = i;
if(check(row)){
if(row == n-1){
sum++;
return;
}
else
dfs(row+1);
}
}
}
int main(){
int i;
for(i = 1 ; i <= 10 ; i ++){    // 打表,因为总共n只有10种情况,实现记录下每种情况的结果,否则每次都dfs一遍会超时。
memset(queen , -1 ,sizeof(queen));
n = i;
sum = 0;
dfs(0);
record[i] = sum;
}
while(scanf("%d" , &n) != EOF){
if(n == 0)
break;
printf("%d\n" , record
);   //直接输出结果。
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: