C++解决八皇后问题

八皇后问题

问题描述:   

    国际象棋中,皇后可以在横、竖、斜线上不限步数地吃掉其它棋子,如何将8个皇后放在8*8的棋盘上,使它们谁也不能吃掉谁,便是著名的八皇后问题。

    对于某个满足要求的八皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相对应摆法中第i个皇后所处的列数。已经知道八皇后问题一共有92组解(即92个不同的皇后串)。给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入数据:

第一行是测试数据的组数n,后面跟着n行输入。每行测试数据占一行,包括一个正整数b(1≤b≤92)。

输出要求:

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应与b的皇后串。

输入样例:

2

1

92

输出样例:

15863724

84136275

解题思路:

    本题较易想到的方法是采用八重循环来实现,但是其耗时太长,且容易混乱。这里采用递归的方法实现。首先八个皇后只能分别居于八个不同的行(由题可知),若把第i个皇后放在第i行,然后用一个循环控制第i个皇后所处的列(一至八列记为j),当(i,j)确定那么这个皇后的位置就被唯一确定,再把(i,j)和之前的皇后的所处位置向比较(假如之前皇后已经记录在hang[k]这个1*8的数组中),那么如果 j==hang[k] 或 abs(k-i)==abs(hang[k]-j)) 即第i个皇后和之前的结果处于同一列或同一斜线上,那么这个皇后(i,j)的摆法就不合适,直接break出去。当判断j这个循环是正常执行完毕(未break),对每组(i,j)记录hang[i]=j,然后i+1重复上述算法(递归),直至i=8,八个皇后(i from 0 to 7)都已经摆放完毕,结束。

执行示例:

C++解决八皇后问题_第1张图片

C++源代码:

#include
using namespace std;

int ans[92][8]={0},n,b,i,j,num,hang[8];

void queen(int i)
{
	//i为第(i+1)个皇后,且表示第i行
	int j,k;
	//第8个皇后(棋盘上的8行)已经放完
	if(i==8)
	{
		for(j=0;j<8;j++)
			ans[num][j]=hang[j]+1;
		num++;//解的总组数+1
		return;
	}
	//这一重循环,把第i个皇后(第i行)能匹配的所有列都找到了
	for(j=0;j<8;j++)//将当前皇后i逐一尝试放置在不同的列(第0~7列)
	{
		for(k=0;k>n;//输入数据的组数
	for(i=0;i>b;//需要的解的组数
		for(j=0;j<8;j++)
			cout<

你可能感兴趣的:(C++解决八皇后问题)