Peking University Online Judge 3009 Curling 2.0
見る人が見たら酷いコードなんだろうなという自覚はある。(ansをグローバルにする行為に敗北感が)
ともあれ蟻本の深さ優先探索についての練習問題は全完
#include<cstdio> #include<algorithm> using namespace std; static const int MAX_W = 20; static const int MAX_H = 20; static const int INF = 1 << 30; int dy[] = {1, 0, -1, 0}; int dx[] = {0, 1, 0, -1}; int w, h; int field[MAX_H][MAX_W]; int res; int sy, sx; void dfs(int y, int x, int cnt){ if(cnt > 10) return ; for(int i = 0; i < 4; i++){ if(field[y + dy[i]][x + dx[i]] == 1) continue; for(int j = 0;; j++){ int ny = y + dy[i] * j; int nx = x + dx[i] * j; if(ny < 0 || ny > h - 1 || nx < 0 || nx > w - 1) break; if(field[ny][nx] == 3){ res = min(cnt, res); return ; } else if(field[ny][nx] == 1){ field[ny][nx] = 0; dfs(ny - dy[i], nx - dx[i], cnt + 1); field[ny][nx] = 1; break; } } } return ; } int main(){ for(;;){ scanf("%d %d", &w, &h); if(w == 0 && h == 0) break; for(int i = 0; i < h; i++){ for(int j = 0; j < w; j++){ scanf("%d", &field[i][j]); if(field[i][j] == 2){ sy = i; sx = j; } } } res = INF; dfs(sy, sx, 1); printf("%d\n", (res == INF ? -1 : res)); } return 0; }