题意:给定一个c*r的地图,上面有Y G # . 四种字符。' # ' 表示该处有石头,且石头每隔k秒会消失一次(还会出现), ' . ' 表示该处是空的可以走。现在问你能否从 Y 到达 G,若可以输出最少花费,否则输出Please give me another chance!。
好难想( ⊙ o ⊙ )啊!,只是想到了对k取余,但是下面的操作还是没处理好。 太弱了 o(╯□╰)o
思路:用vis[x][y][t%k]标记。操作如下
(1) t时刻 在位置(x, y)碰到非字符#,若vis[x][y][t%k]状态未出现,标记入队。
(2) t时刻 在位置(x, y)碰到字符#,若vis[x][y][t%k]未出现 且 t % k == 0,标记入队。
AC代码:
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <vector> #include <map> #define INF 0x3f3f3f3f #define debug printf("1\n") #define MAXN 110 #define MAXM 10000 #define Ri(a) scanf("%d", &a) #define Pi(a) printf("%d\n", (a)) #define Rl(a) scanf("%lld", &a) #define Pl(a) printf("%lld\n", (a)) #define Rs(a) scanf("%s", a) #define Ps(a) printf("%s\n", (a)) #define W(a) while(a--) #define CLR(a, b) memset(a, (b), sizeof(a)) #define LL long long #define eps 1e-8 using namespace std; bool vis[MAXN][MAXN][11]; char str[MAXN][MAXN]; struct Node{ int x, y, step; }; int c, r, k; bool judge(int x, int y){ return x >= 0 && x < r && y >= 0 && y < c; } int BFS(int x, int y) { queue<Node> Q; int Move[4][2] = {0,1, 0,-1, 1,0, -1,0}; CLR(vis, false); Node now, next; now.x = x, now.y = y, now.step = 0; Q.push(now); while(!Q.empty()) { now = Q.front(); Q.pop(); if(str[now.x][now.y] == 'G') return now.step; for(int p = 0; p < 4; p++) { next.x = now.x + Move[p][0]; next.y = now.y + Move[p][1]; if(judge(next.x, next.y)) { if(str[next.x][next.y] != '#') { next.step = now.step + 1; if(!vis[next.x][next.y][next.step%k]) { vis[next.x][next.y][next.step%k] = true; Q.push(next); } } else { next.step = now.step + 1; if(!vis[next.x][next.y][next.step%k] && next.step % k == 0) { vis[next.x][next.y][next.step%k] = true; Q.push(next); } } } } } return -1; } int main() { int t; Ri(t); int sx, sy; W(t) { Ri(r); Ri(c); Ri(k); for(int i = 0; i < r; i++) { Rs(str[i]); for(int j = 0; j < c; j++) { if(str[i][j] == 'Y') { sx = i; sy = j; } } } int ans = BFS(sx, sy); if(ans == -1) printf("Please give me another chance!\n"); else printf("%d\n", ans); } return 0; }