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;

    }

    广搜做法:

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

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290359.html
Copyright © 2011-2022 走看看