Curling 2.0

来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/04/25 09:55

题意大概是:从点s(2)出发求到达g(3)的最少步数。类似于冰球游戏,只能想周围4个方向上相邻没有障碍(1)的方向扔出石子,可以重复到达同一个点,只有石子碰到障碍或者到达g点,或者出范围了石子才会停下。当石子遇到障碍时,障碍的点由1变0,石子弹回前一格继续搜索。总步数不能超过10.

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int w,h;int a[25][25];//1为障碍,0为无障碍,2是起点,3是终点int x[4]={1,-1,0,0};int y[4]={0,0,1,-1};int ans;//记录最少步数void dfs(int s,int e,int num)//num是当前步数{    if(num>10)return ;    if(a[s][e]==3)//当到达终点时更新ans的值    {        if(ans>num)            ans=num;        return ;    }    for(int k=0;k<4;k++)    {        int c,d;        c=s+x[k];        d=e+y[k];        if(a[c][d]==1||c<0||c>=h||d<0||d>=w)continue;//当有障碍或者出范围的时候,继续跳入下一个方向        if(a[c][d]==3)//如果在走一格就是终点就搜终点,并且跳出循环        {            dfs(c,d,num+1);            break;        }        while(a[c][d]==0)//当下一个点是无障碍时        {            c+=x[k];            d+=y[k];//继续更新            if(c<0||c>=h||d<0||d>=w)break;//如果超出范围就终止循环        if(a[c][d]==1)//当更新后的点时有障碍时        {            a[c][d]=0;            dfs(c-x[k],d-y[k],num+1);            a[c][d]=1;        }        if(a[c][d]==3)//当更新后的点是终点        {            dfs(c,d,num+1);            continue;        }        }    }}int main(){    int s,e;    while(scanf("%d%d",&w,&h)!=0)    {        if(w==0&&h==0)            return 0;        memset(a,-1,sizeof(a));        for(int i=0;i<h;i++)        {            for(int j=0;j<w;j++)            {                cin>>a[i][j];                if(a[i][j]==2)                {                    if(a[i][j]==2) s=i;e=j;a[i][j]=0;                }            }        }        ans=11;        dfs(s,e,0);        if(ans==11)cout<<-1<<endl;        else cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击