信息学奥赛一本通 1213:八皇后问题 | OpenJudge NOI 2.5 1700:八皇后问题

news/2024/10/23 12:36:59/

【题目链接】

ybt 1213:八皇后问题
OpenJudge NOI 2.5 1700:八皇后问题

【题目考点】

1. 深搜

【解题思路】

八皇后问题解法请参考:信息学奥赛一本通 1214:八皇后 | OpenJudge NOI 2.5 1756:八皇后

观察本题的输出,可以看出本题是按列放皇后得到的结果,先搜索将皇后放在第一列的位置,第一列的位置确定后再搜索将皇后放在第二列的位置。。。
设二维数组保存放皇后的状态,每当放完第8列,则输出一种合法的八皇后的情况。

另一种思路,仍然是按行放皇后,不过输出时输出保存放皇后情况的矩阵的转置。

【题解代码】

解法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 mp[10][10], n;//mp[i][j]:是否有皇后 n:当前在输出第几个八皇后的情况 
//在位置x,y设置或拿开皇后后,对列、斜线占用情况的变化
void setVis(int x, int y, bool isSet)
{vis_c[x] = isSet;vis_r[x-y+8] = isSet;vis_l[x+y-1] = isSet;
}
//在第y列放皇后
void dfs(int y)
{for(int x = 1; x <= 8; ++x)//能否在第x行第y列放皇后{if(vis_c[x] == false && vis_r[x-y+8] == false && vis_l[x+y-1] == false)//如果(x,y)所在的列及斜线都没有被占用 {mp[x][y] = 1;setVis(x, y, true);//设置对列和斜线的占用 if(y == 8){++n;//情况编号加1cout << "No. " << n << endl;for(int i = 1; i <= 8; ++i){for(int j = 1; j <= 8; ++j)cout << mp[i][j] << ' ';cout << endl; }}elsedfs(y+1);setVis(x, y, false);//状态还原 mp[x][y] = 0;}}
}
int main()
{dfs(1);return 0;
}

解法2:按行放皇后,输出矩阵的转置

#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 mp[10][10], n; 
//在位置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)所在的列及斜线都没有被占用 {mp[x][y] = 1;setVis(x, y, true);//设置对列和斜线的占用 if(x == 8){cout << "No. " << ++n << endl;//输出编号 for(int j = 1; j <= 8; ++j)//输出mp矩阵的转置 {for(int i = 1; i <= 8; ++i)cout << mp[i][j] << ' ';cout << endl;}}elsedfs(x+1);setVis(x, y, false);//状态还原 mp[x][y] = 0;}}
}
int main()
{dfs(1);return 0;
}

http://www.ppmy.cn/news/118951.html

相关文章

1700C - Helping the Nature

题目 Problem - 1700C - Codeforces 题意 ​ 给一个数组&#xff0c;存在以下三种操作&#xff0c; &#xff08;1&#xff09;将数组中 a 1 ∼ a i a_1\sim a_i a1​∼ai​ 的数减一。&#xff08;2&#xff09;将数组中 a i ∼ a n a_i\sim a_n ai​∼an​ 的数减一。&a…

语音合成1700多个中文音频

from aip import AipSpeech import wave, pygame import time import random import os pip install baidu-aip 调用百度语音合成api将文字转换成音频文件 def get_video(msg):APP_ID = 17264707API_KEY = 59xxwY01u0tmS2iUkdiUz4TtSECRET_KEY =

HDU - 1700(计算几何)

问题描述: There is a cycle with its center on the origin. Now give you a point on the cycle, you are to find out the other two points on it, to maximize the sum of the distance between each other you may assume that the radius of the cycle will not exce…

SSS1700设计方案|SSS1700中文说明书

USB音频解码方案|SSS1700方案设计详解SSS1700是台湾鑫创新推出一款USB音频控制芯片。SSS1700相比SSS1629和SSS1630&#xff0c;有下面优势特性&#xff1a;1.整个USB音频设计电路无电容输出&#xff0c;芯片内置12MHz晶振&#xff0c;减少外围器件&#xff0c;整个方案BOM本降低…

51 Nod 1700 首尾排序法

1700 首尾排序法 有一个长度为n的数组 p1, p2, p3, ⋯, pnp1, p2, p3, ⋯, pn &#xff0c;里面只包含1到n的整数&#xff0c;且每个数字都不一样。现在要对这个数组进行从小到大排序&#xff0c;排序的时候只能是把一个数字拿过来放到数组末尾或者开头&#xff0c;问最少要操…

艾默生质量流量计2700/1700调试说明

2700/1700面板操作 一. 屏幕显示说明: SELECT--- 确认键 SCROLL---- 选择键 LED---状态指示灯 二. 显示器密码: 如果需要密码,CODE的字样就会出现在密码屏幕的顶部. 输入密码时候,通过使用SCROLL来选择数字, 并用SELECT移到下一个字符, 一次只好输入一个字符. 如果你面对…

限时开源,一份“扭转乾坤”的与时俱进的1700页Java八股文

今天在某客看到一个程序员自述&#xff0c;内容如下&#xff1a; 人到三十&#xff0c;公司效益不好被裁员&#xff0c;两个月时间面了三十几家&#xff0c;一直不是很顺利&#xff0c;面试问八股&#xff0c;根本答不上来。前期不信邪&#xff0c;正常投简历正常面试&#xf…