萌新求助
查看原帖
萌新求助
1076440
Kano_zyc楼主2023/12/2 15:20

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;
}
2023/12/2 15:20
加载中...