搜索比赛A 走迷宫

本文探讨如何使用算法解决迷宫寻径问题,通过给出的示例,介绍了寻找从起点到终点的最短路径的方法。重点在于理解和实现一种有效的路径搜索策略,确保HK能够顺利走出迷宫。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. 走迷宫1

1000ms
1000ms
65535KB
64-bit integer IO format: %lld Java class name: Main
Font Size:

走迷宫是很有趣的一种游戏,能够锻炼人的记忆力和思维.现在,HK被困在一个迷宫里面了,请你帮助他找到一条最短的路径,能够让他走出迷宫.

迷宫使用一个N*M的矩阵来描述,矩阵中用'.'代表空格可以通行,用'*'代表障碍物,用'S'代表出发点,用'T'代表出口.例如下面的一个矩阵就描述了一个8*8的迷宫

.....T..
..*****.
......*.
*.***.*.
......*.
.****.*.
S..*....
........

每个字符代表1个格子,HK只能在格子间按上下左右的方向移动

Input

每个输入文件只包含一组输入数据.
每组数据第一行是两个正整数N和M(N,M<=100).
接着是一个N*M的矩阵.

Output

如果HK能够走出迷宫,输出最少需要的步数;否则输出-1.

Sample Input

8 8
.....T..
..*****.
......*.
*.***.*.
......*.
.****.*.
S..*....
........

Sample Output

11
题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=841#problem/0
代码:
#include<iostream>
using namespace std;
int a,b,c,d,m,n;
char map[102][102];
int step[102][102];
int main()
{
 cin>>m>>n;
 int i=0,j=0;
 for(i=0;i<m;i++)
  for(j=0;j<n;j++)
  {
   step[i][j]=-1;
   cin>>map[i][j];
   if(map[i][j]=='S')
   {
    a=i;
    b=j;
   }
   if(map[i][j]=='T')
   {
    c=i;
    d=j;
   }
   
  }
  step[a][b]=1;
  if(map[a][b+1]!='*') step[a][b+1]=1;
  if(map[a-1][b]!='*') step[a-1][b]=1;
  for(i=a;i>=c;i--)
   for(j=b;j<=d;j++)
   {
    if(i==a&&j>=b+1&&map[i][j]!='*'&&step[i][j-1]!=-1)
    {
     step[i][j]=step[i][j-1];
    }
    else if(j==b&&i<=a-1&&map[i][j]!='*'&&step[i+1][j]!=-1)
    {
     step[i][j]=step[i+1][j];
    }
    else if(i!=a&&j!=b&&map[i][j]!='*')
    {
     if(step[i+1][j]==-1&&step[i][j-1]==-1) continue;
     else if(step[i+1][j]==-1) step[i][j]=step[i][j-1];
     else if(step[i][j-1]==-1) step[i][j]=step[i+1][j];      
     else step[i][j]=(step[i+1][j]+step[i][j-1])08;
    }
    
   }
   if(step[c][d]!=-1)
    cout<<step[c][d]08<<endl;
   else cout<<0<<endl;
   
   return 0;
}
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
typedef struct
{
    char c;
    int x,y;
    int time;
}move;
move mo[105][105];
int visit[105][105],flag,flag1;
bool judge(move p,int m,int n)
{
    flag1 = 0;
    if(p.x>0)
    {
        if(mo[p.x - 1][p.y].c=='T')
        flag1 = 1;
    }
    if(p.x < n - 1)
    {
        if(mo[p.x + 1][p.y].c=='T')
        flag1 = 1;
    }
    if(p.y>0)
    {
        if(mo[p.x][p.y - 1].c=='T')
        flag1 = 1;
    }
    if(p.y < m - 1)
    {
        if(mo[p.x][p.y + 1].c=='T')
         flag1 = 1;
    }
   if(flag1 == 1)
   return true;
   else
   return false;
}
bool live(move p,int m,int n)
{
    flag = 0;
     if(p.x>0)
    {
        if(mo[p.x - 1][p.y].c!='*')
        {
            flag = 1;
        }
    }
    if(p.x < n - 1)
    {
        if(mo[p.x + 1][p.y].c!='*')
        {
        flag = 1;
        }
    }
    if(p.y>0)
    {
        if(mo[p.x][p.y - 1].c!='*')
        {
            flag = 1;
        }
    }
    if(p.y < m - 1)
    {
        if(mo[p.x][p.y + 1].c!='*')
        {
            flag = 1;
        }
    }
    if(flag == 1)
    return true;
    else
    return false;
}
int main()
{
  int m,n,i,j,l,k;
  queue<move>q;
  move p;
  while(scanf("%d %d" ,&n ,&m)!=EOF)
  {
      getchar();
      while(q.empty()==false)
      q.pop();
      memset(visit,0,sizeof(visit));
      for(i = 0;i < n;i++)
      {
          for(j = 0;j < m;j++)
          {
              scanf("%c",&mo[i][j].c);
              mo[i][j].x = i;
              mo[i][j].y = j;
              if(mo[i][j].c=='S')
              {
                  l = i;
                  k = j;
              }
          }
          getchar();
      }
      q.push(mo[l][k]);
      p = q.front();
      q.pop();
      while(true)
      {
         if(judge(p,m,n) == true)
          break;
          if(live(p,m,n) == true)
        {
          if(p.x+1<n&&visit[p.x+1][p.y] == 0&&mo[p.x + 1][p.y].c=='.')
          {
              mo[p.x+1][p.y].time = p.time+1;
              q.push(mo[p.x+1][p.y]);
              visit[p.x+1][p.y] = 1;
          }
           if(p.x - 1 >= 0&&visit[p.x - 1][p.y] == 0&&mo[p.x - 1][p.y].c == '.')
          {


              mo[p.x - 1][p.y].time = p.time+1;
              q.push(mo[p.x - 1][p.y]);
              visit[p.x - 1][p.y] = 1;
          }
           if(p.y + 1<m&&visit[p.x][p.y + 1] == 0&&mo[p.x][p.y + 1].c=='.')
          {


              mo[p.x][p.y + 1].time = p.time+1;
              q.push(mo[p.x][p.y + 1]);
              visit[p.x][p.y + 1] = 1;
          }
          if(p.y - 1>=0&&visit[p.x][p.y - 1] == 0&&mo[p.x][p.y - 1].c=='.')
          {


              mo[p.x][p.y - 1].time = p.time+1;
              q.push(mo[p.x][p.y - 1]);
              visit[p.x][p.y - 1] = 1;
          }
        }
         if(q.empty() == false )
         {
          p = q.front();
          q.pop();
          flag = 1;
         }
         else
         {
           flag = 0;
           break;
         }
      }
      if(flag == 1)
      printf("%d\n",p.time + 1);
      else
      printf("-1\n");
  }
  return 0;
}
 

还是贴一下海潮哥的代码吧,他的看着比较顺眼而且一般比较简洁。
#include<stdio.h>   
#include<string.h>   
  
struct Node{  
    int x,y;  
    Node(int a=0,int b=0){x=a,y=b;}  
}que[10100];  
int n,m;  
const int fx[]={1,-1,0,0};  
const int fy[]={0,0,1,-1};  
char mp[102][102];  
int vis[102][102];  
  
int bfs(){  
    int s,t,i,j,x,y,nx,ny;  
    memset(vis,-1,sizeof(vis));  
    for(i=0;i<n;i++){  
        scanf("%s",mp[i]);  
        for(j=0;j<m;j++) if(mp[i][j]=='S') x=i,y=j;  
    }  
    que[s=t=0]=Node(x,y);  
    vis[x][y]=0;  
    while(s<=t){  
        x=que[s].x;  
        y=que[s].y;  
        if(mp[x][y]=='T') return vis[x][y];  
        s++;  
        for(i=0;i<4;i++){  
            nx=x+fx[i];  
            ny=y+fy[i];  
            if(nx<0 || nx>=n || ny<0 || ny>=m) continue;  
            if(mp[nx][ny]=='*' || vis[nx][ny]!=-1) continue;  
            vis[nx][ny]=vis[x][y]+1;  
            que[++t]=Node(nx,ny);  
        }  
    }  
    return -1;  
}  
  
int main(){  
    while(~scanf("%d%d",&n,&m))  
        printf("%d\n",bfs());  
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值