您的位置:首页 > 其它

N皇后问题

2012-03-04 18:31 281 查看
Description

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

Input

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

Output

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

Sample Input

1
8
5
0

Sample Output

1
92
10

处理回溯问题,以及要在循环输入之前进行筛。

View Code

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int x[11], N, sum;
bool judge( int k )//判断是否可以加入
{
for( int i = 1; i < k; i++ )
{
if( x[i] == x[k] || abs(k-i) == abs(x[k] - x[i]) )
return false;
}
return true;
}

void dfs( int k )//回溯,K初值为1
{
if( k > N )//安排完后,sum++
sum++;
else
{
for( int i = 1; i <= N; i++ )//第K个皇后的列坐标
{
x[k] = i;
if( judge( k ) )
{
dfs( k+1 );
}
}
}
}

int main()
{
int ans[11];
for( N = 1; N <= 10; N++ )
{
sum = 0;
dfs(1);
ans
= sum;
}//预处理
while(  scanf( "%d", &N )!=EOF &&N )
{
printf( "%d\n", ans
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: