当前位置:首页 > 题解目录 > 正文内容

八皇后2

亿万年的星光5年前 (2021-01-28)题解目录23566

【题目描述】

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8a=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

【题目分析】

(1)八皇后题的改版,上一题只让输出不同的摆放数,这个题输出不同位置对应的串
(2)把答案放到一个数组中,然后将这个数组放到一个二维数组中。

【参考代码1】

#include<iostream>
using namespace std;
int col[10],L_diagonal[10],R_diagonal[10]; //分别表示标记数组,列数组,主对角线数组,副对角线数组
int ans[10]; //结果数组
int sum; //二维数组中用来记答案种数的
int show[100][100]; //二维数组, 因为答案是92个 ,所以设置100个足够了
void add() //累加函数,把符合条件的答案放到二维数组中
{
   sum++; //
   for(int i=1;i<=8;i++)
       show[sum][i]=ans[i]; //把当前列的摆放放到二维数组中
}
int dfs(int i)//用i来表示皇后所处的行位置
{
   int j; //用j表示皇后所处的列位置
   for(j=1;j<=8;j++)
       if((col[j]==0)&&(L_diagonal[i-j+7]==0)&& (R_diagonal[i+j]==0))// 列、主对角线、副对角线没有被占领过
       {
           ans[i]=j; //在当前(i,j)位置上摆放一个皇后
           col[j]=1; //占领当前(i,j)所在的列
           L_diagonal[i-j+7]=1; //占领当前(i,j)所在的主对角线
           R_diagonal[i+j]=1; //占领当前(i,j)所在的副对角线
           if(i==8)
           {
               add(); //函数进行答案整合。
           }
           else
               dfs(i+1);
           col[j]=0; //回溯(i,j)所在的列
           L_diagonal[i-j+7]=0; //回溯当前(i,j)所在的主对角线
           R_diagonal[i+j]=0;//回溯当前(i,j)所在的副对角线    
       }
}
int main()
{
   int n;// 定义n个数
   cin>>n;
   dfs(1); //开始深搜,先把结果都保存
   while(n)
   {
       n--;
       int x;
       cin>>x;
       for(int i=1;i<=8;i++)
           cout<<show[x][i]; //输出对应数据
       cout<<endl;
   }
   
   return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:
    返回列表

    上一篇:八皇后问题

    下一篇:迷宫

    相关文章

    【NOIP2000】计算器的改良

    【题目描述】NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手 ZL...

    【题解】修改回文

    【题目描述】如果一个字符串,顺读与倒读的内容一样,称这个字符串为回文。例如 aka 是一个回文,noon 也是一个回文。给定一个字符串,请计算最少需要修改多少个字符,才能...

    【题解】跳格子2

    【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...

    【题解】剔除相关数

    【题目描述】一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。【输入描述】每组数据前有一个N(<10...

    【题解】单词排序

    【题目描述】输入一行单词序列,相邻单词之间由一个或者多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)【输入描述】一行单词序列,最少一个单词,最多100个单词,每个单词长...

    【算法】最少步数

    【算法】最少步数

    【题目描述】在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知...