curling 2.0 (DFS)

#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;  //min()使用的时候要特别注意
int maze[25][25],dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}},ans,R,C;
void DFS(int x,int y,int step)
{
    if (step>10)
        return ;
    for (int i=0;i<4;i++)
    {
        int a=x,b=y,flag=0;
        while (a>=0 && a<R && b>=0 && b<C)  //一直往前走
        {
            a+=dir[i][0];
            b+=dir[i][1];
            flag++;
            if (maze[a][b]==3)
            {
                ans=min(ans,step+1);        //4个方向,小的就给ans,先到终点先修改;
                return ;
            }
            if (maze[a][b]==1)
                break;
        }
        if (maze[a][b]==1 && flag>1)     //紧挨着石头(flag=1)时,不能动;
        {
            maze[a][b]=0;
            DFS(a-dir[i][0],b-dir[i][1],step+1);
            maze[a][b]=1;
        }
    }
}
int main()
{
    int i,j,R0,C0;
    while(scanf("%d%d",&C,&R)!=EOF)
    {
        if (R==0 && C==0)
            break;
        memset(maze,0,sizeof(maze));
        for (i=0;i<R;i++)
           for (j=0;j<C;j++)
           {
                scanf("%d",&maze[i][j]);
                if (maze[i][j]==2)
                {R0=i;C0=j;}
           }
        ans=0x3fffffff;
        DFS(R0,C0,0);
        if (ans<=10)
        printf("%d\n",ans);
        else
        printf("-1\n");
    }
    return 0;
}
posted @ 2013-12-08 16:15  单调的幸福  阅读(174)  评论(0编辑  收藏  举报