HDU2579 BFS

本文介绍了一种使用BFS算法解决迷宫问题的方法,其中迷宫中的点可能在不同时间被多次访问,通过引入myhash数组来记录点的访问情况。程序首先读取迷宫的大小、迷宫矩阵、起点和终点的位置,然后使用BFS算法寻找从起点到终点的最短路径。若找到路径,则输出路径长度;否则提示重新输入迷宫。

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

题意:从起点到终点,bfs

不同的是对于图中的点,可能走多次,分别是在不同的时刻。

myhash[ i ][ j ][ t%k ]=1:表示坐标( i,j )在 t%k 时刻走过,接下来再出现 t%k 就不用再走一次了。

对于‘.’能入队,必须满足在该时刻没走过这个特点

对于‘#’能入队,必须满足 该时刻没走过 且 该时刻 t%k==0 ;

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<stdlib.h>
 5 #include<queue>
 6 using namespace std;
 7 const int maxn = 105;
 8 const int inf=999999;
 9 int n,m,k;
10 char mat[ maxn ][ maxn ];
11 int myhash[ maxn ][ maxn ][ 12 ];
12 const int dx[]={0,0,1,-1};
13 const int dy[]={1,-1,0,0};
14 struct node{
15     int x,y,t;
16 }mys,mye,p,pp;
17 int ans;
18 
19 void bfs( ){
20     p.x=mys.x,p.y=mys.y,p.t=0;
21     queue<node>q;
22     q.push( p );
23     memset( myhash,0,sizeof(myhash) );
24     mat[ p.x ][ p.y ]=mat[ mye.x ][ mye.y ]='.';
25     while( !q.empty() ){
26         p=q.front(),q.pop();
27         for( int kk=0;kk<4;kk++ ){
28             pp.x=p.x+dx[ kk ],pp.y=p.y+dy[ kk ],pp.t=p.t+1;
29             if( pp.x<0||pp.x>=n||pp.y<0||pp.y>=m ) continue;
30             if( pp.x==mye.x && pp.y==mye.y ){
31                 ans=min( ans,pp.t );
32                 return ;
33             }
34             if(mat[ pp.x ][ pp.y ]=='.' && myhash[ pp.x ][ pp.y ][ pp.t%k ]==0 ){
35                 myhash[ pp.x ][ pp.y ][ pp.t%k ]=1;
36                 q.push( pp );
37             }
38             else if( mat[ pp.x ][ pp.y ]=='#' && pp.t%k==0 && myhash[ pp.x ][ pp.y ][ pp.t%k ]==0 ){
39                 myhash[ pp.x ][ pp.y ][ pp.t%k ]=1;
40                 q.push( pp );
41             }
42         }
43     }
44     return ;
45 }
46 
47 int main(){
48     int T;
49     scanf("%d",&T);
50     while( T-- ){
51         scanf("%d%d%d",&n,&m,&k);
52         for( int i=0;i<n;i++ ){
53             scanf("%s",mat[ i ]);
54             for( int j=0;j<m;j++ ){
55                 if( mat[ i ][ j ]=='Y' ) mys.x=i,mys.y=j;
56                 else if( mat[ i ][ j ]=='G' )mye.x=i,mye.y=j;
57             }
58         }
59         ans=inf;
60         bfs();
61         if( ans==inf ) printf("Please give me another chance!\n");
62         else printf("%d\n",ans);
63     }
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/xxx0624/archive/2013/01/30/2883081.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值