rt,不知道为什么代码没有输出
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 35;
char g[maxn][maxn];
int h, w, cnt;
int x1[maxn], x2[maxn], y1[maxn], y2[maxn];
bool vis[maxn];
char ans[maxn];
void getBorder() {
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (g[i][j] != '.') {
int id = g[i][j] - 'A';
x1[id] = min(x1[id], i);
x2[id] = max(x2[id], i);
y1[id] = min(y1[id], j);
y2[id] = max(y2[id], j);
}
}
}
}
bool check(int id) {
for (int i = x1[id]; i <= x2[id]; i++) {
if (g[i][y1[id]] != '.' && !vis[g[i][y1[id]] - 'A']) return false;
if (g[i][y2[id]] != '.' && !vis[g[i][y2[id]] - 'A']) return false;
}
for (int i = y1[id]; i <= y2[id]; i++) {
if (g[x1[id]][i] != '.' && !vis[g[x1[id]][i] - 'A']) return false;
if (g[x2[id]][i] != '.' && !vis[g[x2[id]][i] - 'A']) return false;
}
return true;
}
void dfs(int num) {
if (num == cnt) {
ans[num] = '\0';
cout << ans << endl;
return;
}
for (int id = 0; id < cnt; id++) {
if (!vis[id] && check(id)) {
vis[id] = true;
for (int i = x1[id]; i <= x2[id]; i++) {
if (g[i][y1[id]] == id + 'A') g[i][y1[id]] = '.';
if (g[i][y2[id]] == id + 'A') g[i][y2[id]] = '.';
}
for (int i = y1[id]; i <= y2[id]; i++) {
if (g[x1[id]][i] == id + 'A') g[x1[id]][i] = '.';
if (g[x2[id]][i] == id + 'A') g[x2[id]][i] = '.';
}
ans[num] = id + 'A';
dfs(num + 1);
vis[id] = false;
for (int i = x1[id]; i <= x2[id]; i++) {
if (g[i][y1[id]] == '.') g[i][y1[id]] = id + 'A';
if (g[i][y2[id]] == '.') g[i][y2[id]] = id + 'A';
}
for (int i = y1[id]; i <= y2[id]; i++) {
if (g[x1[id]][i] == '.') g[x1[id]][i] = id + 'A';
if (g[x2[id]][i] == '.') g[x2[id]][i] = id + 'A';
}
}
}
}
int main() {
cin >> h >> w;
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
cin >> g[i][j];
memset(x1, 0x3f, sizeof(x1));
memset(y1, 0x3f, sizeof(y1));
getBorder();
cnt = 0;
for (int i = 0; i < 26; i++)
if (x1[i] < 0x3f)
cnt++;
dfs(0);
return 0;
}