AOJ 1130 Red and Black
問題
Red and Black | Aizu Online Judge
WxHのフィールドの中でスタート地点から四方に移動する。黒のタイルの上だけを通って移動できるタイルの数を求めよ。
方針
スタート地点からdfsして到達可能なタイルをメモ。タイルの数を最後に数える。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for(int i=0; i<(n); ++i) char field[21][21]; char visit[21][21]; int dx[]= {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; int W, H; void dfs(int y, int x) { visit[y][x] = 1; rep(i, 4) { int ny = y+dy[i]; int nx = x+dx[i]; if(field[ny][nx] == '.' && visit[ny][nx] == 0 && nx >= 0 && nx < W && ny >= 0 && ny < H) { dfs(ny, nx); } } } int main(void){ while(cin >> W >> H && W) { int y, x; rep(i, H) rep(j, W){ cin >> field[i][j]; if(field[i][j] == '@') y = i, x = j; } memset(visit, 0, sizeof(visit)); dfs(y, x); int ans = 0; rep(i, H) rep(j, W){ ans += visit[i][j]; } cout << ans << endl; } }
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1889713
反省
- カウントもdfs関数の中でやった方がきれいなコードになった