练习系统 实验四 八皇后(递归法)

当前编程题:实验四 基础算法问题(16级)---八皇后问题

4.
问题描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入形式
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出形式
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
样例输入
2
1
92
样例输出
15863724
84136275


#include<iostream>
#include<stdlib.h>
using namespace std;
int aa[92][8],bb[8],num=0;


int queen(int i)
{
if(i==8)       //说明已经通过了所有的列的、对角线的判断  则这是一种放法  那么就将这种方法存到aa二维数组中
{
for(int j=0;j<8;j++)
{
aa[num][j]=bb[j]+1;
}
num++;
return 1;               //停止这个函数
}
int k;
for(int j=0;j<8;j++)
{
for(k=0;k<i;k++)
{
if(  bb[k]==j  ||  abs(bb[k]-j)==i-k   )           //前面的条件是为了判断是否是在同一列上   后面的就是判断是否在同一对角线上   同一对角线的判断有点抽象   可以自己用笔画一画  就应该能理解了
{
break;                        //                 停止循环  到下一个空格测试
}
}
if(k==i)                                     //  说明通过了测验 可以往下进行
{
bb[k]=j;
queen(i+1);                   //递归
}
}
return 0;
}




int main()
{
queen(0);            // 开始找八皇后的方法 
int n;
cin>>n;
while(n--)
{
int m;
cin>>m;
for(int i=0;i<8;i++)
{
cout<<aa[m-1][i];
}
cout<<endl;
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值