poj3009 Curling 2.0

来源:互联网 发布:烘焙论坛知乎 编辑:程序博客网 时间:2024/04/29 20:33

题目:http://poj.org/problem?id=3009

题意:就是要求把一个冰壶从起点“2”用最少的步数移动到终点“3”。其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰上滑动),除非冰壶撞到石头1 或者 到达终点 3。冰壶撞到石头后,冰壶会停在石头前面,该块石头会破裂,石头所在的区域由1变为0。


想法:dfs深搜。四个方向。直接看代码吧。今天做这道题回溯搞得我头昏眼涨。一开始写出来这道题能想到的测试组数都对,就是WA到死。本来都打算放弃了,后来看了一下题解,稍微改了改就对了。。。为什么呢?求大神指点啊!!!!




代码(AC):

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dx[4]={1,-1,0,0};int dy[4]={0,0,-1,1};int map[25][25];int w,h;int sx,sy;int ans;int ok(int i,int j){    if(i>=1&&i<=h&&j>=1&&j<=w) return 1;    return 0;}void dfs(int x,int y,int time){    if(time>=10)    return ;    for(int i=0;i<4;i++){        int px=x+dx[i];        int py=y+dy[i];        if(map[px][py]==1) continue;        while(map[px][py]==0){            px+=dx[i];            py+=dy[i];        }        if(ok(px,py)) {            if(map[px][py]==3){                ans=min(time+1,ans);            }            if(map[px][py]==1){                map[px][py]=0;                dfs(px-dx[i],py-dy[i],time+1);                map[px][py]=1;            }        }    }    return ;}int main(){    //freopen("123.txt","r",stdin);    while(~scanf("%d%d",&w,&h)&&w&&h){        memset(map,1,sizeof(map));        for(int i=1;i<=h;i++){            for(int j=1;j<=w;j++){                scanf("%d",&map[i][j]);                if(map[i][j]==2){//2处冰壶也可以滑动,变为0.                    sx=i;                    sy=j;                    map[i][j]=0;                }            }        }        ans=11;        dfs(sx,sy,0);        if(ans!=11)            printf("%d\n",ans);        else            printf("-1\n");    }    return 0;}





WA:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dx[4]={1,-1,0,0};int dy[4]={0,0,-1,1};int map[25][25];bool vis[25][25];int w,h;int sx,sy;int ans;void dfs(int x,int y,int time){    if(time>=10)    return ;    if(ans)  return ;    for(int i=0;i<4;i++){        int px=x+dx[i];        int py=y+dy[i];        if(map[px][py]==1) continue;        while(map[px][py]==0){            px+=dx[i];            py+=dy[i];        }        if(px<=0||px>h||py<=0||py>w) continue;        if(map[px][py]==3){            ans=time+1;            return ;        }        if(px>0&&px<=h&&py>0&&py<=w&&map[px][py]&&!vis[px][py]){            map[px][py]=0;            vis[px][py]=true;            dfs(px-dx[i],py-dy[i],time+1);            map[px][py]=1;            vis[px][py]=true;        }    }    return ;}int main(){    //freopen("123.txt","r",stdin);    while(~scanf("%d%d",&w,&h)&&w&&h){        memset(map,1,sizeof(map));        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;                    map[i][j]=0;                }            }        }        memset(vis,false,sizeof(vis));        ans=0;        dfs(sx,sy,0);        if(ans)            printf("%d\n",ans);        else            printf("-1\n");    }    return 0;}



0 0
原创粉丝点击