5 3 3 100 ... .E. ..Y 5 6 4 ...... ....PR ..E.PY ...ETT ....TT 2 2 100 .E EY 5 5 2 ..... ..P.. .PYP. ..P.. ..... 3 3 1 .E. EYE ...
... .E* .*Y ...*** ..**P* ..E*PY ...E** ....T* .E EY ..*.. .*P*. *PYP* .*P*. ..*.. .E. EYE .*.
bfs+优先队列,刚开始没有优化,果断超时,第二次竟然因为优先级符号TLE!!(该记得的东西真得记牢)
使用mark数组记录该点MV值大小,初始化为零,搜索时只有当从某个点到达当前点使MV变大时才把该点值更新;入队时判断该点MV值是否大于零,大于则入队。
具体看代码:
#include"stdio.h" #include"string.h" #include"queue" #include"vector" #include"algorithm" using namespace std; #define N 105 #define max(a,b) (a>b?a:b) int mark[N][N],n,m,v; int dir[4][2]={0,1,0,-1,-1,0,1,0}; char str[N][N]; struct node { int x,y,d; friend bool operator<(node a,node b) { return a.d<b.d; } }; bool judge(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m) return true; return false; } bool ok(int x,int y) //判断和(x,y)相邻的是否是敌人 { int i,u,v; for(i=0;i<4;i++) { u=dir[i][0]+x; v=dir[i][1]+y; if(judge(u,v)) { if(str[u][v]=='E') return true; //是敌人 } } return false; } void bfs(int x,int y) { int i,t; priority_queue<node>q; node cur,next; cur.x=x;cur.y=y;cur.d=v; q.push(cur); memset(mark,-1,sizeof(mark)); mark[x][y]=v; while(!q.empty()) { cur=q.top(); q.pop(); for(i=0;i<4;i++) { next.x=x=dir[i][0]+cur.x; next.y=y=dir[i][1]+cur.y; if(judge(x,y)) { if(str[x][y]=='.'||str[x][y]=='P') t=cur.d-1; else if(str[x][y]=='T') t=cur.d-2; else if(str[x][y]=='R') t=cur.d-3; else t=-1; if(ok(x,y)&&t>0) t=0; //战斗力减为0 if(t>0&&t>mark[x][y]) { next.d=t; q.push(next); } mark[x][y]=max(mark[x][y],t); } } } } int main() { int T,i,j; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&v); for(i=0;i<n;i++) { scanf("%s",str[i]); } for(i=0;i<n;i++) //寻找起始位置 { for(j=0;j<m;j++) { if(str[i][j]=='Y') { bfs(i,j); break; } } if(j<m) break; } for(i=0;i<n;i++) //输出答案 { for(j=0;j<m;j++) { if(mark[i][j]>=0) { if(str[i][j]!='P'&&str[i][j]!='Y') printf("*"); else printf("%c",str[i][j]); } else printf("%c",str[i][j]); } puts(""); } puts(""); } return 0; }
hdu 3345 War Chess (bfs+优先队列),布布扣,bubuko.com
原文:http://blog.csdn.net/u011721440/article/details/38350741