NYOJ999~师傅又被妖怪抓走了

来源:互联网 发布:个人简历模板软件 编辑:程序博客网 时间:2024/04/28 01:05

思路:BFS。多加一个状态就可以了,状态的变化不是很好写。看代码理解吧。

#include<bits/stdc++.h>using namespace std;const int MAXN = 105;struct node{int x,y,state,step;}NOW,NEXT;int n, m, t, sx, sy, ex1, ey1, ex2, ey2, dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};char MAP[MAXN][MAXN];bool vis[MAXN][MAXN][4];int update(int x,int y,int state)//状态更新 {bool flag1 = false, flag2 = false;//flag1表示是否找到了D, flag表示是否找到了E if(state == 1) flag1 = true; if(state >= 2) flag2 = true; for(int i = x; i < n; i++){if(MAP[i][y] == 'D') flag1 = true;if(MAP[i][y] == 'E') flag2 = true;if(MAP[i][y] != '.') break;}for(int i = x; i >= 0; i--){if(MAP[i][y] == 'D') flag1 = true;if(MAP[i][y] == 'E') flag2 = true;if(MAP[i][y] != '.') break;}for(int i = y; i < m; i++){if(MAP[x][i] == 'D') flag1 = true;if(MAP[x][i] == 'E') flag2 = true;if(MAP[x][i] != '.') break;}for(int i = y; i >= 0; i--){if(MAP[x][i] == 'D') flag1 = true;if(MAP[x][i] == 'E') flag2 = true;if(MAP[x][i] != '.') break;}if(flag1 == false && flag2 == false) return 0;if(flag1 == true  && flag2 == false) return 1;if(flag1 == false && flag2 == true)  return 2;if(flag1 == true  && flag2 == true)  return 3;}int bfs(){memset(vis,0,sizeof(vis));NOW.x = sx; NOW.y = sy; NOW.step = 0; NOW.state = update(sx,sy,0); vis[sx][sy][NOW.state] = true;queue<node> q;q.push(NOW);while(!q.empty()){NOW = q.front();if(NOW.state == 3) return NOW.step;q.pop();for(int i = 0; i < 4; i++){int X = NOW.x + dir[i][0], Y = NOW.y + dir[i][1], state = update(X,Y,NOW.state);if(X >= 0 && Y >= 0 && X < n && Y < m && vis[X][Y][state] == false && MAP[X][Y] == '.'){vis[X][Y][state] = true;NEXT.x = X; NEXT.y = Y; NEXT.state = state; NEXT.step = NOW.step + 1; q.push(NEXT);}}}return -1;//找不到 }int main(){int CASE = 1;while(~scanf("%d%d%d",&n,&m,&t)){for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin>>MAP[i][j];if(MAP[i][j] == 'S'){ MAP[i][j] = '.'; sx = i; sy = j; }}}printf("Case %d:\n",CASE++);int ans = bfs();if(ans > t) ans = -1;//时间不够用 printf("%d\n",ans);}return 0;}