标签:
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 .*.
自己写的spfa代码:
注意输出的每行后面都有一个空行,我就错了presentation error。。。
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct node { int x,y; node(int a,int b){x=a; y=b;} }; int dr[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; int n,m,mv,t,sx,sy; int dis[105][105]; bool vis[105][105]; char mp[102][102]; bool work(int x,int y) { if(mp[x][y]==‘Y‘) return 0; for(int i=0;i<4;i++) { int xx=x+dr[i][0]; int yy=y+dr[i][1]; if(xx<0 || xx>=n || yy<0 || yy>=m) continue; if (mp[xx][yy]==‘E‘) return 1; } return 0; } void spfa() { queue<node> Q; memset(dis,-1,sizeof(dis)); memset(vis,0,sizeof(vis)); Q.push(node(sx,sy)); dis[sx][sy]=mv; vis[sx][sy]=1; while(!Q.empty()) { node p=Q.front(); vis[p.x][p.y]=0; Q.pop(); if (work(p.x,p.y)) dis[p.x][p.y]=0; if (dis[p.x][p.y]>0) for(int i=0;i<4;i++) { int xx=p.x+dr[i][0]; int yy=p.y+dr[i][1]; char ch=mp[xx][yy]; if(xx<0 || xx>=n || yy<0 || yy>=m) continue; if(ch==‘#‘) continue; if(ch==‘.‘|| ch==‘T‘ || ch==‘R‘) { int k; if (ch==‘.‘) k=1; else if (ch==‘T‘) k=2; else if (ch==‘R‘) k=3; if (dis[xx][yy]>=dis[p.x][p.y]-k) continue; dis[xx][yy]=dis[p.x][p.y]-k; if(!vis[xx][yy]) { Q.push(node(xx,yy)); vis[xx][yy]=1; } } if(ch==‘P‘ && dis[p.x][p.y]>1) { if (dis[xx][yy]>=dis[p.x][p.y]-1) continue; dis[xx][yy]=dis[p.x][p.y]-1; if(!vis[xx][yy]) { Q.push(node(xx,yy)); vis[xx][yy]=1; } } } } } int main() { scanf("%d",&t); for(;t>0;t--) { scanf("%d%d%d",&n,&m,&mv); for(int i=0;i<n;i++) { scanf("%s",&mp[i]); for(int j=0;j<m;j++) if (mp[i][j]==‘Y‘) sx=i,sy=j; } spfa(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if (dis[i][j]<0) printf("%c",mp[i][j]); else { if (mp[i][j]==‘E‘ || mp[i][j]==‘P‘ || mp[i][j]==‘Y‘) printf("%c",mp[i][j]); else printf("*"); } } printf("\n"); } printf("\n"); } return 0; }
转自:http://www.bkjia.com/cjjc/857812.html
/* 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=0&&x=0&&yq; 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=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; }
标签:
原文地址:http://www.cnblogs.com/stepping/p/5744565.html