poj-3009 Curling 2.0-DFS

        题干很长这里就不复制了,题意的话估计看图就能懂个差不多,这里简单说一下,一个球在2为起点的位置要到达终点3,途中不碰到墙壁球的移动是不会停止的,并且在触碰墙壁停止后,被碰的墙壁会消失。最后得出到达3需要的最少步数。

        思路:还是平常的DFS,不过需要多加一点东西就是了,比如点的移动时用一个循环使其向一个方向一直移动到碰到墙或走出边界。该题不需要vis标记数组,因为存在重复走点的情况。注意DFS中加入 if(step>10||step>=ans) return; 可以大大优化时间。(不加一定会TLE)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#define INF 0x3f3f3f3f

using namespace std;

int n,m,flag,ans;
int sx,sy;
int Map[50][50];
int vis[50][50];
void DFS(int x,int y,int w,int step)
{
    if(step>10||step>=ans) return;
    if(Map[x][y]==0||Map[x][y]==3||Map[x][y]==2)
    {
        while(1)
        {
            if(Map[x][y]==2)
            {Map[x][y]=0;break;}
            if(Map[x][y]==1)
            {
                Map[x][y]=0;
                if(w==1) x++;
                else if(w==2) y--;
                else if(w==3) x--;
                else if(w==4) y++;
                break;
            }
            if(Map[x][y]==-1) return ;
            if(Map[x][y]==3)
            {
                flag=1;
                if(ans>step) ans=step;
                return ;
            }
            if(w==1) x--;
            else if(w==2) y++;
            else if(w==3) x++;
            else if(w==4) y--;
        }
    }
    if(Map[x-1][y]!=1&&Map[x-1][y]!=-1)
        DFS(x-1,y,1,step+1);
    if(Map[x][y+1]!=1&&Map[x][y+1]!=-1)
        DFS(x,y+1,2,step+1);
    if(Map[x+1][y]!=1&&Map[x+1][y]!=-1)
        DFS(x+1,y,3,step+1);
    if(Map[x][y-1]!=1&&Map[x][y-1]!=-1)
        DFS(x,y-1,4,step+1);
        if(w==1) Map[x-1][y]=1;
        else if(w==2) Map[x][y+1]=1;
        else if(w==3) Map[x+1][y]=1;
        else if(w==4) Map[x][y-1]=1;
        step--;
}
int main()
{
    int i,j;
    while(scanf("%d%d",&m,&n),m||n)
    {
        ans=INF;
        flag=0;
        memset(Map,-1,sizeof(Map));
        for (i=1;i<=n;i++)
        {
            for (j=1;j<=m;j++)
            {
                scanf("%d",&Map[i][j]);
                if(Map[i][j]==2) sx=i,sy=j;
            }
        }
        DFS(sx,sy,0,0);
        if(flag)
        {
            if(ans<=10)
                printf("%d\n",ans);
            else
                printf("-1\n");
        }
        else
            printf("-1\n");
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章