码迷,mamicode.com
首页 > 其他好文 > 详细

2046 Problem D 八皇后

时间:2019-08-03 15:01:13      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:国际象棋   code   size   family   个数   ret   color   oid   方法   

   

题目描述

 

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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的皇后串。

样例输入

3
6
4
25

样例输出

25713864
17582463
36824175


主要是对对角线处理,
其左对角线为[i+n][j-n];
右对角线为[i+n][j+n];

注意判断是否越界。


#include<iostream>
#include<cstdio>
using namespace std;
int n,q[9],g[9][9]//进行标记;
string str[93];
void dfs(int depth){
 if(depth==9){
  ++z;
  for(int a=1;a<=8;a++){
  str[z]+=(char)(q[a]+48);
 }
  return;
}
 for(int i=1;i<=8;i++){
  if(!(g[depth][i])){
  for(int j=1;j<=8;j++){
  g[depth][j]+=1;
  g[j][i]+=1;//进行 列标记
  if((depth+j)<=8&&(i+j)<=8)
  g[depth+j][i+j]+=1;//进行右对角线标记
  if((depth+j<=8)&&(i-j)>0)
  g[depth+j][i-j]+=1;//进行左对角线标记
 }
  q[depth]=i;
  dfs(depth+1);
  
  for(int j=1;j<=8;j++){
  g[depth][j]-=1; 
  g[j][i]-=1;
  if((depth+j)<=8&&(i+j)<=8)
  g[depth+j][i+j]-=1;
  if((depth+j<=8)&&(i-j)>0)
  g[depth+j][i-j]-=1;
 }
 }
 else continue;
 }
 return;
}
int main() {
 int z;
 cin>>n;
 dfs(1);
 for(int i=0;i<n;i++){
  cin>>z;
  cout<<str[z]<<endl;
 }
 return 0;
}


本人小白第一篇题解,多有不好之处,望海涵。我会继续努力的^~^.
[提交][状态]

2046 Problem D 八皇后

标签:国际象棋   code   size   family   个数   ret   color   oid   方法   

原文地址:https://www.cnblogs.com/nqc123/p/11294657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!