
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=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;
}