使用的是最小步数模型
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;
}