n皇后问题
时间: 1ms 内存:64M
描述:
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。 设计一个解n 后问题的队列式分支限界法,计算在n× n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入:
输入数据只占一行,有1 个正整数n,4≤n≤20。
输出:
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
示例输入:
5
示例输出:
1 3 5 2 4
提示:
参考答案(内存最优[1120]):
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
int a[25];
void print(int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]+1);
}
printf("\n");
}
int canPlace(int k)
{
int i;
for(i=0;i<k;i++)
{
if(a[k]==a[i]||abs(i-k)==abs(a[k]-a[i]))
break;
}
if(i>=k)
return 1;
else
return 0;
}
int main()
{
int n,i;
int k=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
k=0;
for(i=0;i<25;i++)
a[i]=0;
a[0]=-1;
while(k>=0)
{
a[k]=a[k]+1;
while(a[k]<n&&!canPlace(k))
a[k]=a[k]+1;
if(a[k]<n)
{
if(k==n-1)
{
print(n);
break;
}
else
{
k++;
a[k]=-1;
}
}
else
k--;
}
}
return 0;
}
参考答案(时间最优[1]):
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
int a[25];
void print(int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]+1);
}
printf("\n");
}
int canPlace(int k)
{
int i;
for(i=0;i<k;i++)
{
if(a[k]==a[i]||abs(i-k)==abs(a[k]-a[i]))
break;
}
if(i>=k)
return 1;
else
return 0;
}
int main()
{
int n,i;
int k=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
k=0;
for(i=0;i<25;i++)
a[i]=0;
a[0]=-1;
while(k>=0)
{
a[k]=a[k]+1;
while(a[k]<n&&!canPlace(k))
a[k]=a[k]+1;
if(a[k]<n)
{
if(k==n-1)
{
print(n);
break;
}
else
{
k++;
a[k]=-1;
}
}
else
k--;
}
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。