zoukankan      html  css  js  c++  java
  • 57.深度优先搜索 广搜练习:迷宫(未结题)

    时间限制: 1 s

     空间限制: 32000 KB

     题目等级 : 黄金 Gold

    题解

    题目描述 Description

    小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。

    输入描述 Input Description

    第一行有三个数nm表示迷宫有n行,m列。

    2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。

    输出描述 Output Description

    至少走几步可以按规定走完,如果不行,输出“Impossible”

    样例输入 Sample Input

    5 5

    A002B

    022C0

    000D0

    00222

    0000E

    样例输出 Sample Output

    26

    数据范围及提示 Data Size & Hint

    0%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“B”

    30%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“G”

    50%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“Z”

    10%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“B”

    30%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“G”

    100%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“Z”

    代码:

    深搜做法:(程序复杂,递归很多,大数据超时)

    #include

    using namespace std;

    #include

    #include

    const int maxn=101;

    #define INF 9999999

    int p[maxn][maxn],n,m,step[28]={0},maxnint;

    struct ZM{

        int x,y;

    };

    ZM zm[27];

    int xx[]={0,0,1,-1};

    int yy[]={1,-1,0,0};

    char maxchar='A';

    void input();

    void DFS(int,int,int,int);

    int main()

    {

        input();

        for(int i=1;i

        DFS(zm[i].x,zm[i].y,i+1,0);

        DFS(zm[maxnint].x,zm[maxnint].y,1,0);

        long long sum=0;

        for(int i=1;i<=maxnint;++i)

        {

            if(step[i]==1667457891)

            {

                printf("Impossible");

                return 0;

            }

            sum+=step[i];

        }

        printf("%d",sum);

        return 0;

    }

    void DFS(int x1,int y1,int i,int ans)

    {

        if(x1==zm[i].x&&y1==zm[i].y&&ans

        {

           step[i]=ans;

           if(i==1)  return;

        }

       

        if(i==maxnint+1)

        {

            i=1;

            ans=0;

        }

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

        

            int x2=x1+xx[j],y2=y1+yy[j];

            if(x2>=1&&x2<=n&&y2>=1&&y2<=m&&p[x2][y2]==0)

            {

              p[x2][y2]=2;

              DFS(x2,y2,i,ans+1);

              p[x2][y2]=0;

            }

         }

     

    }

    void input()

    {

        memset(step,99,sizeof(step));

        scanf("%d%d",&n,&m);

        char ppp[101];

        for(int i=1;i<=n;++i)

         {

           scanf("%s",ppp+1);

          for(int j=1;j<=m;++j)

          {

            if(ppp[j]>='A'&&ppp[j]<='Z')

            {

                if(ppp[j]>=maxchar)

                maxchar=ppp[j];

                int bh=ppp[j]-'A'+1;

                zm[bh].x=i;

                zm[bh].y=j;

                p[i][j]=0;

              }

              if(ppp[j]=='2')

              p[i][j]=2;

             

          }

           

          }

          maxnint=maxchar-'A'+1;

    }

    广搜做法:

    再建一个矩阵,存储由上一个字符到这个点的时间,因此入队进行筛查就行了

  • 相关阅读:
    在OC和Swift中使用IBDesignable/IBInspectable
    Swift之贪婪的UIButton
    iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button
    iOS8中如何将状态栏的字体颜色改为白色
    iOS7 StatusBar 使用小结
    IOS 怎么修改Navigation Bar上的返回按钮文本颜色,箭头颜色以及导航栏按钮的颜色
    android采用videoView播放视频(包装)
    面向对象设计——通用愉快的经历
    OCP-1Z0-051-名称解析-文章12称号
    图片切割工具---产生多个div切割图片 采用for和一的二维阵列设置背景位置
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290360.html
Copyright © 2011-2022 走看看