ACM -- 八皇后问题

Problem Description

求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局。这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线4个方向相互捕捉。如图所示,一个皇后放在棋盘的第4行第3列位置上,则棋盘上凡打“×”的位置上的皇后就能与这个皇后相互捕捉,也就是下一个皇后不能放的位置。  

 

Input

  在程序运行时输入n值的大小,用来确定棋盘的规模,即棋盘共有n×n个方格可以摆放皇后. 

Output

  应输出n个皇后不能互相攻击的所有布局,其中皇后的摆放位置应该满足题目中给出的规定条件。 

Sample Input

     Enter n :    8

     即规定问题为8皇后问题

 

Sample Output

列     行



解题思路:

1. 首先分析题目的意思,每个皇后不能在同一行,同一列,同一对角线存在,这样子的话,就是用(x1, y1),(x2, y2)来表示两个点,这样子就转化成数学问题,只要 保证x1!=x2 && (x1-x2)!= (y1 - y2)即可。

2. 后面代码编写就很简单了!


#include "iostream"
#include "conio.h"
using namespace std;

#define N 100

int iResult[N];

bool Place(int k)
{
	for (int i = 1; i < k; ++i)
	{
		if (iResult[k] == iResult[i] || abs(k - i) == abs(iResult[k] - iResult[i]))
		{
			return false;
		}
	}
	return true;
}

void Queue(int n)
{
	for (int i = 1; i < n + 1; ++i)
	{
		iResult[i] = 0;
	}
	int k = 1;
	while (k >= 1)
	{
		iResult[k] = iResult[k] + 1;
		while ((iResult[k] <= n) && (!Place(k)))
		{
			iResult[k] = iResult[k] + 1;
		}
		if ((iResult[k] <= n )&& (k == n))
		{
			for (int i = 1; i <= n; ++i)
			{
				cout << i << "\t" << iResult[i] << endl;
			}
			//return;
			cout << "Enter a character(Q/q for exit)!" << endl;
			char c = getch();
			if (tolower(c) == 'q')
			{
				return;
			}
			if (iResult[1] == 9)
			{
				return;
			}
		}
		else if ((iResult[k] <= n) && (k < n))
		{
			k = k + 1;
		}else
		{
			iResult[k] = 0;
			k = k - 1;
		}
	}
}

int main()
{
	int n;
	cout << "Enter n:";
	cin >> n;
	Queue(n);
	return 1;
}



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值