N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18263 Accepted Submission(s): 8251
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
Author
cgf
Source
maya大牛的代码就是厉害啊,我刚开始想这道题的思路和棋子问题差不多,然后在斜对角线上就有点卡。
结果看了大牛的分析……人家直接用一维数组……(这思路,太厉害了,跪
这个题主要是用了 两个点横坐标的差的绝对值等于纵坐标差的绝对值,两个点就在一条斜对角线上 这个规律。
具体看注释吧,刚开始学习搜索不建议做这题,太难,估计要看很久才能明白。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int map[15],n,cnt,ans,sum[15];
void dfs(int x)
{
int i,j;
if(x==n+1)//因为x是从1开始计数的=。=,所以n+1==x的时候,放了n个皇后
ans++;
else
{
for(i=1;i<=n;i++)//这个主要是i==n的时候结束循环,其实可以写成别的样子。
{
int flag=1;
map[x]=i;
for(j=1;j<x;j++)
{
if(map[x]==map[j]||abs(x-j)==abs(map[x]-map[j]))//前一个是判定他两在不在同一列
{ //后一个判定在不在同一对角线
flag=0;
break;//在的话直接跳出,这行没有皇后,进入下一行。
}
}
if(flag)
dfs(x+1);//符合题目条件,进入下一个皇后。
}
}
}
void queen()
{
for(n=1;n<=10;n++)//从n=1开始打表,不打表会TLE
{
memset(map,0,sizeof(0));
ans=0;
dfs(1);//从1开始,和上面保持一样
sum[n]=ans;
}
}
int main()
{
queen();
while(scanf("%d",&n),n)
{
printf("%d\n",sum[n]);
}
return 0;
}