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;

    }

    广搜做法:

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

  • 相关阅读:
    万能分页方法!机会难得,在此送给大家
    Java长存!12个Java长久占居主要地位的原因
    angularjs1.x radio组checkbox组
    js动态显示vlc视频直播
    Lodop 分页详解,可详细了呢
    lodop 实现分页打印账单 最后一页右下角加入确认签字
    lodop分页,页眉页脚,foreach分页代码
    ajax最简单验证
    Httpcilent获取带验证码的网站内容
    设计模式(转载)
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290361.html
Copyright © 2011-2022 走看看