POJ 3009 Curling 2.0 dfs
阿新 • • 發佈:2020-12-14
#include<iostream> #include<stdlib.h> using namespace std; #define INF 1e9+7 int map[30][30]; int dir[4][2]={1,0,-1,0,0,1,0,-1}; int xg, yg; int w, h; int ans; void dfs(int x, int y, int cnt) //座標 移動次數 { if(cnt >= ans || cnt > 10) return; for(int i = 0; i < 4; i++) { int xt = x, yt = y; //移動 while(xt+dir[i][0] >= 0 && xt+dir[i][0] < h && yt+dir[i][1] >= 0 && yt+dir[i][1] < w && map[xt+dir[i][0]][yt+dir[i][1]] != 1) { xt += dir[i][0], yt += dir[i][1]; if(map[xt][yt] == 3) //到達終點 { ans = (ans > cnt+1 ? cnt+1 : ans); return; } } if(xt == x && yt == y) continue; //目標方向無法移動 if( (xt+dir[i][0] < 0 || xt+dir[i][0] >= h || yt+dir[i][1] < 0 || yt+dir[i][1] >= w) && cnt != 0) continue; //越界(第一次可能一開始就在邊緣) if(xt+dir[i][0] >= 0 && xt+dir[i][0] < h && yt+dir[i][1] >= 0 && yt+dir[i][1] < w) { map[xt+dir[i][0]][yt+dir[i][1]] = 0; dfs(xt, yt, cnt+1); map[xt+dir[i][0]][yt+dir[i][1]] = 1; } } } int main() { while(cin >> w >> h && w != 0) { ans = INF; int x, y; for(int i = 0; i < h; i++) { for(int j = 0; j < w; j++) { cin >> map[i][j]; if(map[i][j] == 2) x = i, y = j; if(map[i][j] == 3) xg = i, yg = j; } } dfs(x, y, 0); if(ans > 10) cout << -1 << endl; else cout << ans << endl; } system("pause"); return 0; }