チーズ


質問リンク


https://www.acmicpc.net/problem/2638

質問する



キー(Key)

  • エッジにはチーズがないので、エッジからBFSまたはDFSを実行することができる.(以下のコードはbfs)
  • 0(チーズのない領域)にアクセスしない場合は、キューに入れ、キューに入れ(チーズのある領域)、座標値を1増加します.
  • キューが空いているまでbfsを実行すると、地図上の座標サイズが3より大きい座標値は0にリセットされます.(1+接触回数2)
  • はこの操作を繰り返し、数回実行した後にチーズが完全に消えたかどうかを計算し、正しい答えを導いた.
  • 試行錯誤


    似たようなタイプの問題は何度も試したことがあるので、あまり悩んでいません.

    コード#コード#

    #include <iostream>
    #include <queue>
    using namespace std;
    int n, m;
    int maps[101][101];
    bool vi[101][101];
    queue<pair<int, int>> q;
    int dx[4]{ 0,0,1,-1 };
    int dy[4]{ 1,-1,0,0 };
    bool solve() {
    	fill(&vi[0][0], &vi[100][101], false);
    	q.push({ 0,0 });
    	vi[0][0] = true;
    	while (!q.empty()) {
    		int x = q.front().first;
    		int y = q.front().second;
    		q.pop();
    		for (int i = 0; i < 4; i++) {
    			int nx = x + dx[i];
    			int ny = y + dy[i];
    
    			if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
    			if (maps[nx][ny] >= 1) maps[nx][ny]++;
    			else {
    				if (!vi[nx][ny]) {
    					vi[nx][ny] = true;
    					q.push({ nx,ny });
    				}
    			}
    		}
    	}
    	
    	bool check = false;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			if (maps[i][j] >= 3) {
    				maps[i][j] = 0;
    				check = true;
    			}
    			if (maps[i][j] >= 1) {
    				maps[i][j] = 1;
    			}
    		}
    	}
    
    	return check;
    }
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin >> n >> m;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < m; j++) {
    			cin >> maps[i][j];
    		}
    	}
    
    	int cnt = 0;
    	while (solve()) cnt++;
    	cout << cnt;
    }

    ポスト


    これは簡単なbfs dfs問題である.