Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2644 Accepted Submission(s): 735
题解:这道题,首先不能在原地等,自己从一开始就应该要知道,然后走过的路还可以走,所以可以直接对这个点对k的取余来标记就可以,自己从开始想的不能在原地wa就是没考虑可以重复走的问题,改成了可以在原地等,离真相越来越远。。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #define AREA b.x<0||b.x>=r||b.y<0||b.y>=c 8 using namespace std; 9 const int INF=0x3f3f3f3f; 10 const int MAXN=110; 11 char map[MAXN][MAXN]; 12 int sec; 13 int r,c,k; 14 int vis[MAXN][MAXN][10]; 15 int disx[4]={0,0,1,-1}; 16 int disy[4]={1,-1,0,0}; 17 struct Node{ 18 int x,y; 19 }; 20 void bfs(int sx,int sy){ 21 Node a,b; 22 int t; 23 sec=0; 24 queue<Node>dl; 25 memset(vis,0,sizeof(vis)); 26 a.x=sx;a.y=sy; 27 vis[sx][sy][0]=1; 28 dl.push(a); 29 while(!dl.empty()){ 30 t=dl.size(); 31 sec++; 32 while(t--){ 33 a=dl.front(); 34 dl.pop(); 35 for(int i=0;i<4;i++){ 36 b.x=a.x+disx[i];b.y=a.y+disy[i]; 37 if(AREA)continue; 38 if(vis[b.x][b.y][sec%k])continue; 39 if(sec%k==0){ 40 if(map[b.x][b.y]==‘G‘){ 41 printf("%d\n",sec); 42 return; 43 } 44 vis[b.x][b.y][sec%k]=1; 45 dl.push(b); 46 } 47 else{ 48 if(map[b.x][b.y]==‘#‘){ 49 continue; 50 } 51 if(map[b.x][b.y]==‘G‘){ 52 printf("%d\n",sec); 53 return; 54 } 55 vis[b.x][b.y][sec%k]=1; 56 dl.push(b); 57 } 58 } 59 } 60 } 61 puts("Please give me another chance!"); 62 } 63 int main(){ 64 int T; 65 scanf("%d",&T); 66 while(T--){ 67 scanf("%d%d%d",&r,&c,&k); 68 int sx,sy,ex,ey; 69 for(int x=0;x<r;x++){ 70 scanf("%s",map[x]); 71 for(int y=0;y<c;y++){ 72 if(map[x][y]==‘Y‘)sx=x,sy=y; 73 } 74 } 75 bfs(sx,sy); 76 } 77 return 0; 78 }
原文:http://www.cnblogs.com/handsomecui/p/4927562.html