信息学奥赛一本通(1214:八皇后)
1214:八皇后
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 9918 通过数: 6127
【题目描述】
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8a=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
【分析】
显然问题的关键在于如何判定某个皇后所在的行、列、斜线上是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同列上,则列号相同;如果同在 / 斜线上,则行列值之和相同;如果同在 \ 斜线上,则行列值之差相同;从下图可验证。
考虑每行有且仅有一个皇后,设一维数组 a[1...8] 表示皇后的放置∶第 i 行皇后放在第 j 列,
用 a[i] = j 来表示,即下标是行数,内容是列数。例如∶a[3] = 5 就表示第3个皇后在第3行第5列上。
判断皇后是否安全,即检查同一列、同一对角线是否已有皇后,建立标志数组 b[1...8] 控制
同一列只能有一个皇后,若两皇后在同一对角线上,则其行列坐标之和或行列坐标之差相等,故亦可建立标志数组 c[1...16]、d[-7...7]控制同一对角线上只能有一个皇后。如果斜线不分方向,则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同。在这种方式下,要表示两个皇后 i 和 i 不在同一列或斜线上的条件可以描述为∶(a[i]!=a[j]) && (abs(i-j) != abs(a[i]-a[j])) { i 和 j 分别表示两个皇后的行号 }。
【参考代码】
#include <stdio.h>
#include <math.h>
#define N 9
int a[N]; //皇后放置数组
int b[N]; //标志数组,控制同一列只有一个皇后
int c[N]; //标志数组,控制正向对角线只能有一个皇后
int d[N]; //标志数组,控制反向对角线只能有一个皇后
int sum,x;
void print()
{int i;sum++; //方案数累加1 if(x==sum){for(i=1;i<=8;i++)printf("%d",a[i]);printf("\n");}
}
void dfs(int i)
{int j;for(j=1;j<=8;j++) // 每个皇后都有8位置(列)可以试放{if(!b[j] && !c[i+j] && !d[i-j+7]) //寻找放置皇后的位置 { //由于C++不能操作负数组,因此考虑加7a[i]=j; //摆放皇后 b[j]=1; //宣布占领第j列 c[i+j]=1; //占领两个对角线 d[i-j+7]=1;if(i==8) //8个皇后都放好,输出 print();else //继续递归放置下一个皇后 dfs(i+1);b[j]=0; //递归返回,即为回溯一步,当前皇后退出 c[i+j]=0;d[i-j+7]=0;}}
}
int main()
{int i,j,t;scanf("%d",&t);while(t--){x=0;scanf("%d",&x);dfs(1); //从第一个皇后开始放置 sum=0;}return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1214
信息学奥赛一本通(1214:八皇后)相关推荐
- 信息学奥赛一本通 1214:八皇后 | OpenJudge NOI 2.5 1756:八皇后
[题目链接] ybt 1214:八皇后 OpenJudge NOI 2.5 1756:八皇后 [题目考点] 1. 深搜 2. 二维数组 同一行:行坐标相同 同一列:列坐标相同 同一左上右下斜线:行列坐 ...
- 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法 更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...
- 信息学奥赛一本通 (C++)上机练习
信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...
- 经典问题的另类解法——以信息学奥赛一本通c++版1216红与黑为例
题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn) 题目描述: 有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动 ...
- 信息学奥赛一本通在线提交地址
信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...
- 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”
董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...
- 信息学奥赛一本通 提高篇 第5章 矩阵乘法
例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...
- 《信息学奥赛一本通提高篇》第6章 组合数学
例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...
- 《信息学奥赛一本通 提高篇》
提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...
- 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分
信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...
最新文章
- python计算数据百分比_概率计算:定义概率分布数据结构,Python实现概率分布计算...
- 0基础学python-从0开始学Python,0基础小白
- HTML5标签的语义认知和理解
- win11 WSL Ubuntu更换为清华源
- 力扣两数之和 II - 输入有序数组
- react-router4 + webpack Code Splitting
- html 最新计算倒计时,javascript实时计算时间倒计时
- 基于JAVA+SpringMVC+MYSQL的勤工助学管理系统
- android之NDK version was not found
- 记风雨兼程的2020年,2021年,我来了!
- php解析shapefile,Fiona简介及Shapefile数据读取
- #S/4HANA 1610: Use case series intro and collection
- 30天自制操作系统——第一天到第二天
- 直播APP软件开发,直播系统开发的技术架构揭秘
- springAop原理之(三)Advised接口族
- Windows 的应急事件分类-
- redis C接口hiredis 简单函数使用介绍
- 讯搜 配置mysql_迅搜使用指南
- 小白都能看懂的关于Mixins机制的理解
- 孙振耀退休感言(一)