<span style="font-size:18px;color:#009900;">#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int a[15], b[15];
int sum=0, n, m;
int place(int t)
{
int i;
for(i=1; i<t; i++)
{
if((abs(i-t)==abs(a[i]-a[t]))||a[i]==a[t])<span style="color:#3333FF;">//判断皇后的位置是否可以</span>
return 0;
}
return 1;
}
int DFS(int k)
{
int i;
if(k>n)
sum++;
else
{
for(i=1; i<=n; i++)
{
a[k]=i;<span style="color:#3333FF;">//i表示皇后现在所处的列数</span>
if(place(k))
{
DFS(k+1);
}
}
}
return sum;
}
int main()
{
int i;
<span style="color:#3333FF;"> //先将1到10内所有的可能打出来</span>
for(i=1; i<=10; i++)
{
n=i;
sum=0;
memset(a, 0, sizeof(a));
b[i]=DFS(1);
}
while(scanf("%d", &m)!=EOF&&m)
{
printf("%d\n", b[m]);
}
return 0;
}</span>
N皇后问题
<span style="font-size:18px;color:#009900;">#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int a[15], b[15];
int sum=0, n, m;
int place(int t)
{
int i;
for(i=1; i<t; i++)
{
if((abs(i-t)==abs(a[i]-a[t]))||a[i]==a[t])<span style="color:#3333FF;">//判断皇后的位置是否可以</span>
return 0;
}
return 1;
}
int DFS(int k)
{
int i;
if(k>n)
sum++;
else
{
for(i=1; i<=n; i++)
{
a[k]=i;<span style="color:#3333FF;">//i表示皇后现在所处的列数</span>
if(place(k))
{
DFS(k+1);
}
}
}
return sum;
}
int main()
{
int i;
<span style="color:#3333FF;"> //先将1到10内所有的可能打出来</span>
for(i=1; i<=10; i++)
{
n=i;
sum=0;
memset(a, 0, sizeof(a));
b[i]=DFS(1);
}
while(scanf("%d", &m)!=EOF&&m)
{
printf("%d\n", b[m]);
}
return 0;
}</span>
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
对于判断皇后的位置,我用一个一维数组来存皇后现在所在的列数,在根据 i-k==a[i]-a[k] 来判断是否在对角线上,根据 a[i]==a[j] 判断是否在同一列
1
92
10
对于判断皇后的位置,我用一个一维数组来存皇后现在所在的列数,在根据 i-k==a[i]-a[k] 来判断是否在对角线上,根据 a[i]==a[j] 判断是否在同一列
主要存在的问题是超时,刚开始一直交都超时,后来是用了打表的方式,先打出1到10内的所有可能,在输出就可以解决超时的问题