使用的是最小步数模型
st存的是当前状态的属于第几行
bfs(i)表示遍历最终有i行
#include <iostream>
#include <cstring>
#include <unordered_map>
#include <queue>
#include <time.h>
using namespace std;
const int N = 20;
int n;
unordered_map<string, int> st;
char g[N][N];
bool check(int x, int y) {
for (int i = 0; i < y; i ++)
if (g[x][i] == 'Q') return false;
for (int i = 0; i < x; i ++)
if (g[i][y] == 'Q') return false;
for (int i = 1; i <= x; i ++) {
if ((y - i) >= 0 && g[x - i][y - i] == 'Q') return false;
if ((y + i) < n && g[x - i][y + i] == 'Q') return false;
}
return true;
}
void get(string &t) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g[i][j] = t[i * n + j];
}
}
}
string get() {
string res;
for (int i = 0; i < n ; i++)
for (int j = 0; j < n; j++) {
res += g[i][j];
}
return res;
}
void show() {
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j++) {
printf("%c", g[i][j]);
}
printf("\n");
}
printf("\n");
}
void bfs(int u) {
queue<string> store;
string temp = get();
store.push(temp);
st[temp] = 0;
while (store.size()) {
auto temp = store.front();
store.pop();
get(temp);
int line = st[temp];
if (line == u) {
show();
}
else
for (int i = 0; i < n; i++) {
if (check(line, i)) {
g[line][i] = 'Q';
string state = get();
if (st.count(state) == 0) {
store.push(state);
st[state] = st[temp] + 1;
}
g[line][i] = '.';
}
}
}
}
void init() {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = '.';
}
int main() {
cin >> n;
init();
bfs(n);
return 0;
}
该博客主要介绍了如何利用宽度优先搜索(BFS)策略来解决著名的八皇后问题。作者首先定义了检查函数以验证当前位置是否可以放置皇后,然后通过BFS遍历所有可能的放置位置,每层表示棋盘上的行数。在遍历过程中,如果找到正确解决方案,会显示当前的棋盘状态。博客还包含了初始化棋盘和获取棋盘状态的辅助函数。
3875

被折叠的 条评论
为什么被折叠?



