【題解】ZeroJudge e584: 11094 – Continents

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=e584
【解題想法】DFS

  • 注意:
    • 地圖的大小為M x N,最多包含兩個不同的字母。不一定是 w 和 l。
    • 地球是圓的,所以地圖最左區域(x, 0)和最右區域(x, N-1)相連。
    • 先從 (X, Y) 出發,把Mijid大帝目前擁有的土地先表示成已經拜訪過,再開始計算其它土地的大小。
#include <iostream>
#include <cstring>
using namespace std;
#define pii pair<int,int>
#define F first
#define S second
int M, N, X, Y, land_size;
char g[25][25], land_mark;
int vis[25][25];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};

void dfs(int x, int y){
    vis[x][y] = 1;
    land_size++;
    for (int i = 0; i < 4; i++){
        int nx = x + dx[i];
        int ny = y + dy[i];
        //地球是圓的,所以地圖最左區域(x, 0)和最右區域(x, N-1)相連。
        if (ny > N-1) ny = 0;
        if (ny < 0) ny = N-1;
        if (nx >= 0 && nx < M && ny >= 0 && ny < N && g[nx][ny] == land_mark && !vis[nx][ny]){
            dfs(nx, ny);
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    string s;
    while (cin >> M >> N && M+N){
        for (int i = 0; i < M; i++){
            cin >> s;
            for (int j = 0; j < N; j++){
                vis[i][j] = 0;
                g[i][j] = s[j];
            }
        }
        cin >> X >> Y;
        land_size = 0;
        //找出代表土地的符號
        land_mark = g[X][Y];
        dfs(X, Y);
        int mx = 0;
        for (int i = 0; i < M; i++){
            for (int j = 0; j < N; j++){
                if (g[i][j] == land_mark && !vis[i][j]){
                    land_size = 0;
                    dfs(i, j);
                    mx = max(mx, land_size);
                }
            }
        }
        cout << mx << "\n";
    }
    return 0;
}

分享本文 Share with friends