1. 程式人生 > 實用技巧 >POJ 3009 Curling 2.0 dfs

POJ 3009 Curling 2.0 dfs

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