[COCI2006-2007#1] Slikar
Posted 66dzb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[COCI2006-2007#1] Slikar相关的知识,希望对你有一定的参考价值。
【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
以上是关于[COCI2006-2007#1] Slikar的主要内容,如果未能解决你的问题,请参考以下文章
Luogu_4329 [COCI2006-2007#1] Bond
P4645 [COCI2006-2007 Contest#3] BICIKLI