信息学奥赛一本通 1214:八皇后 | OpenJudge NOI 2.5 1756:八皇后
【题目链接】
ybt 1214:八皇后
OpenJudge NOI 2.5 1756:八皇后
【题目考点】
1. 深搜
2. 二维数组
同一行:行坐标相同
同一列:列坐标相同
同一左上右下斜线:行列坐标差值相同
同一右上左下斜线:行列坐标加和相同
【解题思路】
每个皇后会占用它所在的行、列及两条斜线。因此自然一行中只能放一个皇后。
本题关键是如何表示对竖线及斜线的占用
设数组vis_c
,vis_c[i]
表示第i列是否已被占用。
对于斜线被占用的情况:
对于一个8行8列的矩阵,其左上右下斜线数量有15条,行坐标减纵坐标差值最小为-7,最大为7。将这个数字加上8后,数字范围为1~15,可以对应第1条斜线,第2条斜线,…,第15条斜线。
设数组vis_r
,vis_r[x-y+8]
表示(x,y)所在的左上右下斜线是否已被占用
对于一个8行8列的矩阵,其右上左下斜线数量有15条,行坐标与列坐标加和最小为2,最大为16。将这个数字减1后,数字范围为1~15,可以对应第1条斜线,第2条斜线,…,第15条斜线。
设数组vis_l
,vis_l[x+y-1]
表示(x,y)所在的右上左下斜线是否已被占用。
确定第x行放皇后的位置,搜索每一列y,如果(x,y)所在的列、左上右下斜线、右上左下斜线都没有被占用(即vis_c[y]
,vis_l[x+y-1]
,vis_r[x-y+8]
都为false
),那么可以在(x,y)位置放皇后,更新竖线及斜线的占用状态,接着搜索下一行放皇后的位置。搜索结束后注意状态还原。
如果已经在第8行放了皇后,那么就得到一个皇后串,此时就不用再到下一行搜索放皇后的位置了。
至于皇后串的构建,可以用整型变量或字符串来保存。本例使用的是整型变量。
设整型变量q保存皇后串,末尾添加数字y,写法为q = q*10 + y
,去掉末尾数字,写法为:q /= 10
。
用整型数组res保存所有皇后串,res[i]
为第i个皇后串。
由于遍历的过程中,每一行都是从小到大遍历的,所以得到的皇后串一定也是从小到大按顺序得到的。
搜索过程整体完成后,即可针对每次询问输出对应的皇后串。
【题解代码】
解法1:深搜
- 用整数表示皇后串
#include <bits/stdc++.h>
using namespace std;
bool vis_c[10], vis_r[16], vis_l[16];//vis_c[i]:第i列是否被占用 vis_l[i]:第i右上左下斜线是否被占用 vis_r[i]:第i左上右下斜线是否被占用
int q, res[100], r_i;//q:皇后串 res[i]:第i个皇后串 r_i:皇后串的个数
//在位置x,y设置或拿开皇后后,对列、斜线占用情况的变化
void setVis(int x, int y, bool isSet)
{vis_c[y] = isSet;vis_r[x-y+8] = isSet;vis_l[x+y-1] = isSet;
}
//在第x行放皇后
void dfs(int x)
{for(int y = 1; y <= 8; ++y)//能否在第x行第y列放皇后{if(vis_c[y] == false && vis_r[x-y+8] == false && vis_l[x+y-1] == false)//如果(x,y)所在的列及斜线都没有被占用 {q = q*10 + y;//皇后串末尾添加y setVis(x, y, true);//设置对列和斜线的占用 if(x == 8)res[++r_i] = q;//记录皇后串 elsedfs(x+1);setVis(x, y, false);//状态还原 q /= 10;//皇后串去掉末尾数字 }}
}
int main()
{dfs(1);int n, a;cin >> n;for(int i = 1; i <= n; ++i){cin >> a;cout << res[a] << endl;}return 0;
}
- 用string类对象表示皇后串
#include <bits/stdc++.h>
using namespace std;
bool vis_c[10], vis_r[16], vis_l[16];//vis_c[i]:第i列是否被占用 vis_l[i]:第i右上左下斜线是否被占用 vis_r[i]:第i左上右下斜线是否被占用
string q;//q:皇后串
vector<string> res;//res[i-1]:第i个皇后串
//在位置x,y设置或拿开皇后后,对列、斜线占用情况的变化
void setVis(int x, int y, bool isSet)
{vis_c[y] = isSet;vis_r[x-y+8] = isSet;vis_l[x+y-1] = isSet;
}
//在第x行放皇后
void dfs(int x)
{for(int y = 1; y <= 8; ++y)//能否在第x行第y列放皇后{if(vis_c[y] == false && vis_r[x-y+8] == false && vis_l[x+y-1] == false)//如果(x,y)所在的列及斜线都没有被占用 {q.push_back(char(y+'0')); //皇后串末尾添加y(转为字符型数字) setVis(x, y, true);//设置对列和斜线的占用 if(x == 8)res.push_back(q);//记录皇后串 elsedfs(x+1);setVis(x, y, false);//状态还原 q.pop_back();//皇后串去掉末尾数字 }}
}
int main()
{dfs(1);int n, a;cin >> n;for(int i = 1; i <= n; ++i){cin >> a;cout << res[a-1] << endl;//a从1开始,res下标从0开始 }return 0;
}
信息学奥赛一本通 1214:八皇后 | OpenJudge NOI 2.5 1756:八皇后相关推荐
- 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶
[题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...
- 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
[题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...
- 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题
[题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...
- 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818
[题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...
- 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09
[题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...
- 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08
[题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...
- 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯
[题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...
- 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援
[题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...
- 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题
[题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...
最新文章
- Delphi 2010 新增功能之: 软键盘、触摸键盘(TTouchKeyboard)
- oracle cpu 利用率过高 kswapd0_服务器带宽监测与利用率过高的解决办法
- python烟花表白_python炫酷烟花表白源代码
- U盘 制作 win 7 64bit 旗舰版 安装盘
- 使用谷歌语音识别打造语音管家HiVoice
- 2019蓝桥杯决赛Java_2019年蓝桥杯省赛总结
- google浏览器截取长图
- 国内国外很火爆的代码生成器
- 计算机职称photoshop,职称计算机考试photoshop核心通关技巧
- 2015年动画电影观影指南
- 代码急转弯——Tupper(塔珀自指公式)
- HTML和Css基础知识点笔记
- 鸿蒙系统首批机型,鸿蒙系统名单确认,麒麟9000机型首批,众多机型要说再见!...
- 【工业互联网】余晓晖:工业互联网发展态势与展望
- vim 常用功能大全
- git撤回上一次的提交
- 计算机系统动态库修复,一键修复!动态库文件 mfc100u.dll 修复使用说明
- 重启服务器命令有哪些,每一个重启命令区别又是什么?
- codeforces 579D(35/600)
- 中国非定向信标市场市场趋势研究与竞争策略分析报告2022-2028年
热门文章
- java将实体数据导出到excel,压缩,删除等一系列~
- html点击按钮显示星期,js实现日期显示的一些操作(实例讲解)
- 钉钉企业微信集成免登录
- 微软账户 设置 服务器地址,设置Microsoft账户提示此电子邮件地址是保留域怎么办...
- 计算机教师面试专业技能部分,教师招聘考试面试,专业技能测试考什么?全在这了...
- 情人节程序员用HTML网页表白【七夕告白(520气球)】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- IDEA创建JavaFX项目并打包成jar包和exe可执行文件
- 数据库原理第六章课后题答案(第四版)
- centos 6.5 编译安装了 Nginx1.6.0+MySQL5.6.19+PHP5.5.14
- 为什么一条普通的100M有线网络要优于1000M无线?