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;

}

广搜做法:

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

原文地址:https://www.cnblogs.com/c1299401227/p/5370763.html