九度oj 题目1140:八皇后
2024-10-21 03:28:39
- 题目描述:
-
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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 ;
}
最新文章
- Oracle数据行拆分多行
- bzoj1251
- Oracle体系中各个组件的含义
- Testlink部署全攻略
- ListView简单使用
- 微信的redirect_uri参数错误原因分析
- 第12章 纤程(Fiber)
- Xamarin.Android开发实践(九)
- hbase查询,scan详解
- DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
- C#基础系列(一)
- opencv for python 之 突出点检测
- OpenLayers 3加载本地Google切片地图
- python爬虫知识点三--解析豆瓣top250数据
- SQL语句整理1
- JavaScript的作用域链
- 关于读取XML文件代码【学习笔记】
- ROWNUM = 1 to replace count(*)
- DbSet<;T>;().Where(e =>; true)之后再想Include怎么办?
- 得到一个Object的属性