题目描述:

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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 <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#define MAX 10
#define inf 1000000009
int mat[MAX][MAX];
int temp[MAX];
int ans[][MAX];
int cnt = ; bool isOk(int x, int y) {
int a = , b = ;
for(int i = ; i < ; i++) {
a = a + mat[x][i];
b = b + mat[i][y];
if(a >= || b >= ) {
return false;
}
}
for(int i = x - , j = y-; i >= && j >= ; i--, j--) {
if(mat[i][j] == ) {
return false;
}
}
for(int i = x - , j = y+; i >= && j < ; i--, j++) {
if(mat[i][j] == ) {
return false;
}
}
return true;
} void dfs(int n) {
if(n == ) {
cnt++;
for(int i = ; i < ; i++) {
ans[cnt][i] = temp[i];
}
return;
}
for(int i = ; i < ; i++) {
if(isOk(n,i)) {
mat[n][i] = ;
temp[n] = i+;
dfs(n+);
mat[n][i] = ;
}
}
} int main(int argc, char const *argv[])
{
int n;
//freopen("input.txt","r",stdin);
memset(mat, , sizeof(mat));
dfs();
while(scanf("%d",&n) != EOF) {
while(n--) {
int m;
scanf("%d",&m);
for(int i = ; i < ; i++) {
printf("%d",ans[m][i]);
}
puts("");
} }
return ;
}

其实,判断是否可以放置的代码还可以利用temp,使其更简洁

 #include <cstdio>
#include <string>
#include <cstring>
#define MAX 10
int mat[MAX][MAX];
int temp[MAX];
int ans[][MAX];
int cnt = ; bool isOk(int x, int y) {
for(int i = ; i < x; i++) {
if(temp[i]- == y) {
return false;
}
if(temp[i]-+ i == (x+y) || temp[i] - - i == (y-x)) {
return false;
}
}
return true;
} void dfs(int n) {
if(n == ) {
cnt++;
for(int i = ; i < ; i++) {
ans[cnt][i] = temp[i];
}
return;
}
for(int i = ; i < ; i++) {
if(isOk(n,i)) {
mat[n][i] = ;
temp[n] = i+;
dfs(n+);
mat[n][i] = ;
}
}
} int main(int argc, char const *argv[])
{
int n,m;
memset(mat, , sizeof(mat));
dfs();
while(scanf("%d",&n) != EOF) {
while(n--) {
scanf("%d",&m);
for(int i = ; i < ; i++) {
printf("%d",ans[m][i]);
}
puts("");
}
}
return ;
}

最新文章

  1. Oracle数据行拆分多行
  2. bzoj1251
  3. Oracle体系中各个组件的含义
  4. Testlink部署全攻略
  5. ListView简单使用
  6. 微信的redirect_uri参数错误原因分析
  7. 第12章 纤程(Fiber)
  8. Xamarin.Android开发实践(九)
  9. hbase查询,scan详解
  10. DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
  11. C#基础系列(一)
  12. opencv for python 之 突出点检测
  13. OpenLayers 3加载本地Google切片地图
  14. python爬虫知识点三--解析豆瓣top250数据
  15. SQL语句整理1
  16. JavaScript的作用域链
  17. 关于读取XML文件代码【学习笔记】
  18. ROWNUM = 1 to replace count(*)
  19. DbSet&lt;T&gt;().Where(e =&gt; true)之后再想Include怎么办?
  20. 得到一个Object的属性

热门文章

  1. 除虫记——有关WindowsAPI文件查找函数的一次压力测试
  2. Javafinal变量
  3. 用YII实现多重查询(基于tag)
  4. 清空iptables
  5. JAVA 配置
  6. spring boot 下 dataTable|pagehelper 组合进行分页 筛选 排序
  7. python-DB模块实例
  8. Log4J的配置与使用详解
  9. c++ 计算彩票中奖概率
  10. 【模板】任意模数NTT