您的位置:首页 > 其它

Curling 2.0 POJ - 3009 dfs

2017-08-29 19:25 381 查看
题意:

给出一个矩阵,由0,1,2,3组成,2代表冰球出发点,3代表目的地,0代表路,1代表石头障碍,每次运动只能走路,而且一直走到再次碰到石头或者边界,如果碰到石头,则将石头击碎,自己返回上一步地点,问最少步数,如果步数大于10,则输出-1,否则输出步数(<10)。

思路:深度搜索  +  回溯。

AC代码:

#include<cstdio>

#include<cstring>

#include<iostream>

#include<iomanip>

#include<cstdlib>

#include<algorithm>

 using namespace std;

 const int maxn=0x3f3f3f3f3f;

 int mi=maxn;

 int l,h,flag,sx,sy,ex,ey;

 int dx[5]={0,1,0,-1};

 int dy[5]={1,0,-1,0};

 int g[30][30];

 void init()

 {

    // memset(g,0,sizeof(g));

     for(int i=0;i<h;i++)

        for(int j=0;j<l;j++)

     {

         scanf("%d",&g[i][j]);

         if(g[i][j]==2)

         {

             sx=i,sy=j;

             g[i][j]=0;

         }

         if(g[i][j]==3)

            ex=i,ey=j;

     }

     mi=maxn;//注意有多组数据,每次都要重新给mi赋值。

 }

 void dfs(int step,int x,int y)

 {

     if(step>10) return ;

     for(int i=0;i<4;i++)

{

          int nx=x+dx[i];

          int ny=y+dy[i];

     if(g[nx][ny]==1)//如果是石头换方向搜索

        continue;

     while(!g[nx][ny])//如果是路一直走到石头或边界

     {

         nx+=dx[i];

         ny+=dy[i];

     }

     if(nx>=0&&nx<h&&ny>=0&&ny<l)//没有走出界s

     {

         if(g[nx][ny]==1)//如果走到了石头上

         {

             g[nx][ny]=0;//敲碎石头

           dfs(step+1,nx-dx[i],ny-dy[i]);//回溯

            g[nx][ny]=1;//回溯必须还原原来状态

         }

            if(nx==ex&&ny==ey)

         {

                if(step<mi)

               mi=step;

         }

     }

}

}

 int main()

 {

     while(scanf("%d%d",&l,&h))

     {

         if(l==0&&h==0)  break;

         init();

         dfs(1,sx,sy);

         if(mi<maxn)

            cout<<mi<<endl;

         else

            cout<<-1<<endl;;

     }

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: