八皇后问题(C语言)

【问题描述】

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。例如下图就是八皇后问题的一个解:
在这里插入图片描述
假如一棋盘已经正确放置了七个皇后,编写程序求解最后一个皇后的放置位置。

【输入形式】

按照棋盘列由小到大的顺序从控制台输入已正确放置的皇后的行数(行数从1开始计数),未放置皇后的列以字符“”表示。各行数和字符“”之间没有任何其它字符分隔,在输入末尾有回车换行符。例如:上图棋盘假如第5列没有放置皇后,其它七个皇后都已放置完毕,则输入的形式为:4815*263。

【输出形式】

在标准输出上输出最后一个皇后应该放置的行数(行数大于等于1,小于等于8,行数后的回车换行可有可无)。若无解,则输出字符串:No Answer。

【输入样例1】

481*7263

【输出样例1】

5

【样例1说明】

根据输入样例,在棋盘的第一列、第四行位置放置了一皇后,同样在第二列、第八行,第三列、第一行,第五列、第七行,第六列、第二行,第七列、第六行,第八列、第三行也分别放置了一皇后,第四列没有放置皇后。那么为了满足八皇后问题的要求,我们只有在第四列、第五行放置一皇后,所以输出行数为5。

【输入样例2】

1526374*

【输出样例2】

No Answer

【样例2说明】

根据输入样例,在棋盘的第一列、第一行,第二列、第五行,第三列、第二行,第四列、第六行,第五列、第三行,第六列、第七行,第七列、第四行分别放置了一皇后,第八列没有放置皇后。但是根据八皇后问题的要求,前七个皇后放置之后,第八列任何位置都不能放置皇后,否则就会被吃掉。所以输出:No Answer。

#include<stdio.h>
#include<stdlib.h>
int hashTable[9] = { 0 };
int main()
{
	char c;
	int n, a[9], i, j, t=0;
	int col;
	for (i = 1; i <= 8; i++)
	{
		scanf("%c",& c);
		char s[1];
		s[0]=c;
		if (c >= 48 && c <= 57)
		{
			a[i] = atoi(s);//转化为整型
			hashTable[a[i]] = 1;//标记位置
		}
		else
			col = i;//未输入的皇后所在列数
	}
	for (j = 1; j <= 8; j++)
	{
		if (hashTable[j] == 0)
			t = j;//代表未输入的皇后的位置
	}
	int flag = 1;
	for (i = 1; i <= 8 && i != col; i++)
	{
		if (abs(i - col) == abs(a[i] - t))//如果在一条线上
		{
			flag = 0;
			break;
		}
	}
	if (flag)
		printf("%d", t);
	else
		printf("No Answer");
	return 0;
}
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值