题目评价:非常经典!经典的一道DFS(深度优先搜索)的题,比较难,用到了不少东西
题干:
八皇后问题
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:中等
分数:100 OI排行榜得分:12(0.1*分数+2*难度)
描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入描述
(无)
输出描述
按给定顺序和格式输出所有八皇后问题的解(见样例)。
用例输入 1
(无)
用例输出 1
No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ...以下省略
这是我的解题方案,用的是DFS和经典递归:
#include<iostream>
using namespace std;
bool vis_c[10], vis_r[16], vis_l[16];
int mp[10][10], n;
void setVis(int x, int y, bool isSet)
{
vis_c[y] = isSet;
vis_r[x-y+8] = isSet;
vis_l[x+y-1] = isSet;
}
void dfs(int x)
{
for (int y = 1; y <= 8; ++y)
{
if (vis_c[y] == false && vis_r[x-y+8] == false && vis_l[x+y-1] == false)
{
mp[x][y] = 1;
setVis(x, y, true);
if (x == 8)
{
cout << "No. " << ++n << endl;
for (int j = 1; j <= 8; ++j)
{
for (int i = 1; i <= 8; ++i)
{
cout << mp[i][j] << ' ';
}
cout << endl;
}
}
else
{
dfs(x + 1); //递归
}
setVis(x, y, false);
mp[x][y] = 0;
}
}
}
int main()
{
dfs(1);
return 0;
}