题目链接:
题目链接:
《训练指南》P307
分析:只需要预处理每个格子起火的时间,在BFS扩展节点的时候加一个判断,到达该节点的时候,格子没有起火。
写法很巧妙,两次BFS类似,数据加一维kind,表示Joe到达该点和火到达该点。
#includeusing namespace std;const int INF = 0x3f3f3f3f;const int maxr = 1000+5;const int maxc = 1000+5;int R,C;char maze[maxr][maxc];struct Cell{ int r,c; Cell (int r,int c) : r(r),c(c) {}};const int dr[] = {-1,1,0,0};const int dc[] = { 0,0,-1,1};int d[maxr][maxc][2] ,vis[maxr][maxc][2];queue Q;void bfs(int kind){ while(!Q.empty()) { Cell cell = Q.front(); Q.pop(); int r = cell.r, c = cell.c; for(int dir = 0; dir < 4; dir++) { int nr = r + dr[dir], nc = c + dc[dir]; if(nr >= 0 && nr < R && nc >= 0 && nc < C && maze[nr][nc] == '.' && !vis[nr][nc][kind]) { Q.push(Cell(nr, nc)); vis[nr][nc][kind] = 1; d[nr][nc][kind] = d[r][c][kind] + 1; } } }}int ans;void check(int r,int c){ if(maze[r][c]!='.'||!vis[r][c][0]) return; ///走不到 if(!vis[r][c][1]||d[r][c][0] | fires; for(int i=0;i