博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
九度oj 题目1140:八皇后
阅读量:4709 次
发布时间:2019-06-10

本文共 2965 字,大约阅读时间需要 9 分钟。

题目描述:

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

样例输入:
2192
样例输出:
1586372484136275
1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define MAX 10 8 #define inf 1000000009 9 int mat[MAX][MAX];10 int temp[MAX];11 int ans[100][MAX];12 int cnt = 0;13 14 bool isOk(int x, int y) {15 int a = 0, b = 0;16 for(int i = 0; i < 8; i++) {17 a = a + mat[x][i];18 b = b + mat[i][y];19 if(a >= 1 || b >= 1) {20 return false;21 }22 }23 for(int i = x - 1 , j = y-1; i >=0 && j >= 0; i--, j--) {24 if(mat[i][j] == 1) {25 return false;26 }27 }28 for(int i = x - 1 , j = y+1; i >=0 && j < 8; i--, j++) {29 if(mat[i][j] == 1) {30 return false;31 }32 }33 return true;34 }35 36 void dfs(int n) {37 if(n == 8) {38 cnt++;39 for(int i = 0; i < 8; i++) {40 ans[cnt][i] = temp[i];41 }42 return;43 }44 for(int i = 0; i < 8; i++) {45 if(isOk(n,i)) {46 mat[n][i] = 1;47 temp[n] = i+1;48 dfs(n+1);49 mat[n][i] = 0;50 }51 }52 }53 54 int main(int argc, char const *argv[])55 {56 int n;57 //freopen("input.txt","r",stdin);58 memset(mat, 0, sizeof(mat));59 dfs(0);60 while(scanf("%d",&n) != EOF) {61 while(n--) {62 int m;63 scanf("%d",&m);64 for(int i = 0; i < 8; i++) {65 printf("%d",ans[m][i]);66 }67 puts("");68 }69 70 }71 return 0;72 }

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

1 #include 
2 #include
3 #include
4 #define MAX 10 5 int mat[MAX][MAX]; 6 int temp[MAX]; 7 int ans[100][MAX]; 8 int cnt = 0; 9 10 bool isOk(int x, int y) {11 for(int i = 0; i < x; i++) {12 if(temp[i]-1 == y) {13 return false;14 }15 if(temp[i]-1+ i == (x+y) || temp[i] -1 - i == (y-x)) {16 return false;17 }18 }19 return true;20 }21 22 void dfs(int n) {23 if(n == 8) {24 cnt++;25 for(int i = 0; i < 8; i++) {26 ans[cnt][i] = temp[i];27 }28 return;29 }30 for(int i = 0; i < 8; i++) {31 if(isOk(n,i)) {32 mat[n][i] = 1;33 temp[n] = i+1;34 dfs(n+1);35 mat[n][i] = 0;36 }37 }38 }39 40 int main(int argc, char const *argv[])41 {42 int n,m;43 memset(mat, 0, sizeof(mat));44 dfs(0);45 while(scanf("%d",&n) != EOF) {46 while(n--) {47 scanf("%d",&m);48 for(int i = 0; i < 8; i++) {49 printf("%d",ans[m][i]);50 }51 puts("");52 }53 }54 return 0;55 }

 

转载于:https://www.cnblogs.com/jasonJie/p/5738376.html

你可能感兴趣的文章
Asp.Net Mvc Area二级域名
查看>>
android:intent flags
查看>>
Vue疑难杂症
查看>>
spring boot 错误处理之深度历险
查看>>
MySQL对于有大量重复数据表的处理方法
查看>>
Android应用开发学习笔记之多线程与Handler消息处理机制
查看>>
ubuntu 设置环境变量
查看>>
Linux磁盘及文件系统(三)Linux文件系统
查看>>
别在最好的年纪辜负最好的自己
查看>>
用github来展示你的前端页面吧
查看>>
深入分析java中文乱码问题
查看>>
CF #329 D
查看>>
jquery之别踩白块游戏的实现
查看>>
索引的分类--B-Tree索引和Hash索引
查看>>
Python学习笔记——参数axis=0,1,2...
查看>>
kivy学习三:打包成window可执行文件
查看>>
兄弟连PHP培训教你提升效率的20个要点
查看>>
【快报】基于K2 BPM的新一代协同办公门户实践交流会
查看>>
关于MySQL的行转列的简单应用
查看>>
Queue 队列的用法
查看>>