POJ3009 Curling 2.0

来源:互联网 发布:linux重启网络服务失败 编辑:程序博客网 时间:2024/05/16 18:19

         dfs,,可是明知道是dfs还是不会做=-=。。。。

题目大意,,在一张板上,从s处开始击球,方向仅限于上下左右,球只要撞击到墙壁(用1表示)球就会静止下来,同时墙壁会碎掉,变为0(用0表示空),求问经过最少几次击球能到达g(目标)。

   击球的时候要注意几点:

                                    1.球只会撞到墙或到达g点会停下来;

                                     2.不能向边上有墙壁的方向击球;

                                     题目意思是不是挺简单的呀?可就是做不出,还是看了题解才有思路,出处点击打开链接

         

 #include <iostream>#include <stdio.h>#define inf 0x3f3f3f3f#define M 1008using namespace std;int map[M][M];int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};int w,h;bool flag=false;int min_step;void dfs(int x,int y,int step){    if(step>=10)        return ;    int xx,yy;    for(int i=0;i<4;i++)    {        xx=x+dir[i][0];        yy=y+dir[i][1];        if(xx<1||xx>h||yy<1||yy>w)        continue ;        if(map[xx][yy]==1)            continue ;            while(map[xx][yy]!=1&&map[xx][yy]!=3)            {                xx+=dir[i][0];                yy+=dir[i][1];                if(xx<1||xx>h||yy<1||yy>w)                    break;            }    if(xx<1||xx>h||yy<1||yy>w)        continue ;            if(map[xx][yy]==3)            {                min_step=min(min_step,step+1);                return ;            }            else            {                map[xx][yy]=0;                dfs(xx-dir[i][0],yy-dir[i][1],step+1);                map[xx][yy]=1;            }    }}int main(){    freopen("in.txt","r",stdin);while(scanf("%d%d",&w,&h),w){    min_step=inf;    int sx,sy,gx,gy;    for(int i=1;i<=h;i++)    {        for(int j=1;j<=w;j++)        {            scanf("%d",&map[i][j]);            if(map[i][j]==2)            {                sx=i;                sy=j;            }            else if(map[i][j]==3)            {                gx=i;                gy=j;            }        }    }    dfs(sx,sy,0);    if(min_step != inf) {            printf("%d\n", min_step);        }        else printf("-1\n");}    return 0;}

不过掌握了一点技巧了,就是如何在dfs里面求最小值,

就是下面的这些代码

 if(map[xx][yy]==3)            {                min_step=min(min_step,step+1);                return ;            }


是不是很方便呀


其实还有一点我想说在循环方面我连while都忘记了。。。=-=

就是这几点了。。

                 





































0 0
原创粉丝点击