【题目链接】

ybt 1214:八皇后
OpenJudge NOI 2.5 1756:八皇后

【题目考点】

1. 深搜

2. 二维数组

同一行:行坐标相同
同一列:列坐标相同
同一左上右下斜线:行列坐标差值相同

同一右上左下斜线:行列坐标加和相同

【解题思路】

每个皇后会占用它所在的行、列及两条斜线。因此自然一行中只能放一个皇后。
本题关键是如何表示对竖线及斜线的占用
设数组vis_cvis_c[i]表示第i列是否已被占用。
对于斜线被占用的情况:
对于一个8行8列的矩阵,其左上右下斜线数量有15条,行坐标减纵坐标差值最小为-7,最大为7。将这个数字加上8后,数字范围为1~15,可以对应第1条斜线,第2条斜线,…,第15条斜线。
设数组vis_rvis_r[x-y+8]表示(x,y)所在的左上右下斜线是否已被占用

对于一个8行8列的矩阵,其右上左下斜线数量有15条,行坐标与列坐标加和最小为2,最大为16。将这个数字减1后,数字范围为1~15,可以对应第1条斜线,第2条斜线,…,第15条斜线。
设数组vis_lvis_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:八皇后相关推荐

  1. 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶

    [题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...

  2. 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛

    [题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...

  3. 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题

    [题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...

  4. 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818

    [题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...

  5. 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09

    [题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...

  6. 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08

    [题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...

  7. 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯

    [题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...

  8. 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援

    [题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...

  9. 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题

    [题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...

最新文章

  1. Delphi 2010 新增功能之: 软键盘、触摸键盘(TTouchKeyboard)
  2. oracle cpu 利用率过高 kswapd0_服务器带宽监测与利用率过高的解决办法
  3. python烟花表白_python炫酷烟花表白源代码
  4. U盘 制作 win 7 64bit 旗舰版 安装盘
  5. 使用谷歌语音识别打造语音管家HiVoice
  6. 2019蓝桥杯决赛Java_2019年蓝桥杯省赛总结
  7. google浏览器截取长图
  8. 国内国外很火爆的代码生成器
  9. 计算机职称photoshop,职称计算机考试photoshop核心通关技巧
  10. 2015年动画电影观影指南
  11. 代码急转弯——Tupper(塔珀自指公式)
  12. HTML和Css基础知识点笔记
  13. 鸿蒙系统首批机型,鸿蒙系统名单确认,麒麟9000机型首批,众多机型要说再见!...
  14. 【工业互联网】余晓晖:工业互联网发展态势与展望
  15. vim 常用功能大全
  16. git撤回上一次的提交
  17. 计算机系统动态库修复,一键修复!动态库文件 mfc100u.dll 修复使用说明
  18. 重启服务器命令有哪些,每一个重启命令区别又是什么?
  19. codeforces 579D(35/600)
  20. 中国非定向信标市场市场趋势研究与竞争策略分析报告2022-2028年

热门文章

  1. java将实体数据导出到excel,压缩,删除等一系列~
  2. html点击按钮显示星期,js实现日期显示的一些操作(实例讲解)
  3. 钉钉企业微信集成免登录
  4. 微软账户 设置 服务器地址,设置Microsoft账户提示此电子邮件地址是保留域怎么办...
  5. 计算机教师面试专业技能部分,教师招聘考试面试,专业技能测试考什么?全在这了...
  6. 情人节程序员用HTML网页表白【七夕告白(520气球)】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  7. IDEA创建JavaFX项目并打包成jar包和exe可执行文件
  8. 数据库原理第六章课后题答案(第四版)
  9. centos 6.5 编译安装了 Nginx1.6.0+MySQL5.6.19+PHP5.5.14
  10. 为什么一条普通的100M有线网络要优于1000M无线?