hdu 5040 BFS 多维化处理图
http://acm.hdu.edu.cn/showproblem.php?pid=5040
跟这一题http://blog.csdn.net/u011026968/article/details/39586669
算是异曲同工。
所以比較easy想到了vis[4][MAXN][MAXN] 表示监控摄像头转4个方向
那个3秒跟蛇也非常像,但是处理起来还有点麻烦。參考了这里:
http://blog.csdn.net/hongrock/article/details/39472269
写的真不错:
方法:
dir数组就是依照顺时针方式的四个方向
den[4][MAXN][MAXN]处理出来图上各个时间是否须要延迟3秒
假设如今所在位置或者下一个位置在受监控区,就须要3秒
只是略蛋疼的是,那个3秒,假设如今在受监控区,下一秒就不在了,还是须要3秒。这个题目的离散时间跟现实连续时间有差异感觉好怪
#include<cstdio> #include<cstring> #include<queue> using namespace std; #define CL(a,b) memset(a,b,sizeof(a)) #define IN(s) freopen(s,"r",stdin) #define OUT(s) freopen(s,"w",stdout) const int MAXN = 500+30; struct Node{ int x,y,t; Node(){} Node(int x, int y, int t):x(x),y(y),t(t){} bool operator < (const Node & tm)const{ return t>tm.t; } }; int mx,my,n; char mat[MAXN][MAXN]; int vis[4][MAXN][MAXN], den[4][MAXN][MAXN]; int dir[4][2]={ {-1,0},{0,1},{1,0},{0,-1}}; inline int alp(char c) { if(c == 'N')return 0; if(c == 'S')return 2; if(c == 'W')return 3; if(c == 'E')return 1; return -1; } inline int legal(int x, int y) { if(x>=0 && y>=0 && x<n && y<n && mat[x][y]!='#') return 1; return 0; } int bfs() { priority_queue<Node>q; CL(vis,0); q.push(Node(mx,my,0)); while(!q.empty()) { Node tmp=q.top(); q.pop(); if(vis[tmp.t%4][tmp.x][tmp.y])continue; if(mat[tmp.x][tmp.y] == 'T')return tmp.t; vis[tmp.t%4][tmp.x][tmp.y]=1; q.push(Node(tmp.x,tmp.y,tmp.t+1)); for(int i=0;i<4;i++) { int x=tmp.x+dir[i][0]; int y=tmp.y+dir[i][1]; if(!legal(x,y))continue; int tmpt=tmp.t; if(den[tmp.t%4][x][y] || den[tmp.t%4][tmp.x][tmp.y])tmpt+=3; else tmpt++; if(!vis[tmpt%4][x][y])q.push(Node(x,y,tmpt)); } } return -1; } int main() { //IN("hdu5040.txt"); int ncase,ic=0; scanf("%d",&ncase); while(ncase--) { CL(den,0); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",mat[i]); for(int j=0;j<n;j++) { if(mat[i][j] == 'M'){mx=i;my=j;} else { int al=alp(mat[i][j]); if(~al)//al==-1的时候,此处推断条件才是0 { for(int k=0;k<4;k++) { den[k][i][j]=1;// N S E W int x=i+dir[(al+k)%4][0]; int y=j+dir[(al+k)%4][1]; if(x>=0 && y>=0 && x<n && y<n)den[k][x][y]=1; } } } } //getchar(); } printf("Case #%d: %d\n", ++ic, bfs()); } return 0; }