【timegate】 https://www.luogu.org/problem/P4328 【解题思路】 广搜详见注释 【code】 1 #includecstdio 2 #includecstring 3 #includequeue 4 #define N 60 5 using namespace std; 6 struct Queue 7 { 8 int x,y; 9 }; 10 struct Way 11
【timegate】
https://www.luogu.org/problem/P4328
【解题思路】
广搜详见注释
【code】
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #define N 60 5 using namespace std; 6 struct Queue 7 { 8 int x,y; 9 }; 10 struct Way 11 { 12 int x,y,time; 13 }; 14 queue<Queue>q;//洪水蔓延的队列 15 queue<Way>b;//刺猬回家的队列 16 int n,m,time[N][N],dx[]={0,1,-1,0},dy[]={1,0,0,-1}; 17 bool vis[N][N]; 18 char map[N][N]; 19 int main() 20 { 21 memset(time,0x3f3f3f,sizeof time);//初值无限大,否则60分 22 scanf("%d%d",&n,&m); 23 for (int i=1;i<=n;i++) 24 { 25 scanf("%s",map[i]+1);//独特的读入方式 26 for (int j=1;j<=m;j++) 27 { 28 if (map[i][j]==‘*‘)//立刻入队 29 { 30 Queue t=(Queue){i,j}; 31 q.push(t); 32 time[i][j]=0; 33 vis[i][j]=1; 34 } 35 if (map[i][j]==‘S‘)//立刻入队 36 { 37 Way t=(Way){i,j,0}; 38 b.push(t); 39 } 40 } 41 } 42 for (;!q.empty();) 43 { 44 Queue T=q.front(); 45 q.pop(); 46 for (int i=0;i<4;i++) 47 { 48 int x=T.x+dx[i],y=T.y+dy[i]; 49 if (x>0&&x<=n&&y>0&&y<=m&&!vis[x][y]&&map[x][y]!=‘X‘&&map[x][y]!=‘D‘)//判断下一个点是否合法 50 {//入队 51 Queue t=(Queue){x,y}; 52 q.push(t); 53 time[x][y]=time[T.x][T.y]+1; 54 vis[x][y]=1; 55 } 56 } 57 } 58 memset(vis,0,sizeof vis);//别忘了更新 59 for (;!b.empty();) 60 { 61 Way T=b.front(); 62 b.pop(); 63 for (int i=0;i<4;i++) 64 { 65 int x=T.x+dx[i],y=T.y+dy[i],z=T.time; 66 if (x>0&&x<=n&&y>0&&y<=m&&map[x][y]!=‘X‘&&z+1<time[x][y]&&!vis[x][y])//判断下一个点是否合法 67 {//入队 68 Way t=(Way){x,y,z+1}; 69 b.push(t); 70 vis[x][y]=1; 71 if (map[x][y]==‘D‘)//一旦找到,就一定是最优的,立刻输出,结束程序 72 { 73 printf("%d",z+1); 74 return 0; 75 } 76 } 77 } 78 } 79 puts("KAKTUS"); 80 return 0; 81 }