题目描述:

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

九度oj 题目1140:八皇后的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. 关于IE兼容的问题

    以下内容,均来自不同的网站,非本人原创,只是收集一下放在一起! =============================== [一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 ...

  2. iOS组件化开发· 什么是组件化

    越来越多公司,开始了组件化,你还要等到什么时候...... 说到开发模式,我们最熟知的开发模式 MVC 或者最近比较热门的MVVM.但是我今天说的组件化的开发,其实MVC不是一类的.它其实是····· ...

  3. sqlite总结1

    I Shell下命令行程序CLP I .help II 命令的简写 .e = .quit .s .h = .help II 数据库管理 A 创建数据库 1 CREATE TABLE id_name(i ...

  4. codevs 1313 质因数分解

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题目描述 Description 已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数 . 输入描述 I ...

  5. Windows 8.1 explorer.exe 出错 “Application Hang”

    不知道为什么explorer常常会卡一下 看系统日志发现有来源于“Application Hang”的错误 部分常规信息: 程序 explorer.exe 版本 6.3.9600.17415 停止与 ...

  6. A*算法研究

    许多工业与科学计算问题都可以转化为在图中寻路问题.启发式的寻路方法将问题表示为一个图,然后利用问题本身的信息,来加速解的搜索过程.一个典型的例子是有一些通路连接若干城市,找出从指定起点城市到指定终点城 ...

  7. 利用enum4linux 445端口+wordpress插件任意文件上传的一次渗透

    探测内网80端口发现目标IP 目标使用Apache  2.4.7web服务中间件 使用linux    Ubuntu系统 使用御剑扫描了目录 目录扫描到了 http://192.168.31.236/ ...

  8. 双击窗体是模拟键盘上的Tab键

    实现效果: 知识运用: SendKeys类的Send方法 //向活动应用程序发送击键 public static void Send (string keys) 实现代码: private void ...

  9. HibernateDaoSupport类的底层中hql操作使用

    spring的ApplicationContex.xml 中配置 sql 查询方法: 加载数据源的两种方式: <!--方式一:使用 c3p0 连接池 加载数据源 --> <bean ...

  10. 浅谈倍增LCA

    题目链接:https://www.luogu.org/problemnew/show/P3379 刚学了LCA,写篇blog加强理解. LCA(Least Common Ancestors),即最近公 ...