n皇后问题

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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注