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;
}