/*
剛開始沒用二維數組存每次更新出來的最大的mv值,後來看階梯報告才發現可以這樣做啊。。。。
需要注意一下,
當你遇到E時,只有當v值>0時,才讓v=0;
即v=0時,v=0;
否則不用;
這裡有點坑
2013/04/22-13:25
*/
[cpp]
#include"stdio.h"
#include"string.h"
#include"queue"
#define N 111
using namespace std;
char map[N][N],ans[N][N];
//map--原始串,ans---更新的串
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int n,m,mv;
int X,Y;
int dp[N][N];
//dp[x][y]--存x,y位置的最大mv值
struct node
{
int x,y,v;
}p,q;
queue<node>Q;
//判斷函數
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)return 1;
return 0;
}
//對v處理
int fun(int x,int y,int v)
{
int i;
int xx,yy,vv;
if(map[x][y]=='T')vv=v-2;
else if(map[x][y]=='R')vv=v-3;
else vv=v-1;
for(i=0;i<4;i++)
{
xx=x+dir[i][0];
yy=y+dir[i][1];
if(judge(xx,yy)&&map[xx][yy]=='E')
/*這裡需要注意一下,
當你遇到E時,只有當v值>0時,才讓v=0;
即v=0時,v=0;
否則不用;
這裡有點坑
*/
return vv>0?0:vv;
}
return vv;
}
void bfs()
{
int i;
p.x=X;
p.y=Y;
p.v=mv;
Q.push(p);
dp[X][Y]=mv;
ans[X][Y]='Y';
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p.v==0)continue;
for(i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
q.v=p.v;
if(!judge(q.x,q.y))continue;
if(map[q.x][q.y]=='Y'
||map[q.x][q.y]=='E'||map[q.x][q.y]=='#')continue;
q.v=fun(q.x,q.y,q.v);
if(q.v<0)continue;
if(q.v>dp[q.x][q.y])
{
dp[q.x][q.y]=q.v;
Q.push(q);
if(map[q.x][q.y]!='P')
ans[q.x][q.y]='*';
}
}
}
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&mv);
getchar();
memset(dp,-1,sizeof(dp));
for(i=0;i<n;i++)
{
gets(map[i]);
for(j=0;map[i][j];j++)
{
if(map[i][j]=='Y')
{
X=i;Y=j;
}
ans[i][j]=map[i][j];
}
ans[i][m]='\0';
}
bfs();
for(i=0;i<n;i++)
puts(ans[i]);
printf("\n");
}
return 0;
}
#include"stdio.h"
#include"string.h"
#include"queue"
#define N 111
using namespace std;
char map[N][N],ans[N][N];
//map--原始串,ans---更新的串
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int n,m,mv;
int X,Y;
int dp[N][N];
//dp[x][y]--存x,y位置的最大mv值
struct node
{
int x,y,v;
}p,q;
queue<node>Q;
//判斷函數
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)return 1;
return 0;
}
//對v處理
int fun(int x,int y,int v)
{
int i;
int xx,yy,vv;
if(map[x][y]=='T')vv=v-2;
else if(map[x][y]=='R')vv=v-3;
else vv=v-1;
for(i=0;i<4;i++)
{
xx=x+dir[i][0];
yy=y+dir[i][1];
if(judge(xx,yy)&&map[xx][yy]=='E')
/*這裡需要注意一下,
當你遇到E時,只有當v值>0時,才讓v=0;
即v=0時,v=0;
否則不用;
這裡有點坑
*/
return vv>0?0:vv;
}
return vv;
}
void bfs()
{
int i;
p.x=X;
p.y=Y;
p.v=mv;
Q.push(p);
dp[X][Y]=mv;
ans[X][Y]='Y';
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p.v==0)continue;
for(i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
q.v=p.v;
if(!judge(q.x,q.y))continue;
if(map[q.x][q.y]=='Y'
||map[q.x][q.y]=='E'||map[q.x][q.y]=='#')continue;
q.v=fun(q.x,q.y,q.v);
if(q.v<0)continue;
if(q.v>dp[q.x][q.y])
{
dp[q.x][q.y]=q.v;
Q.push(q);
if(map[q.x][q.y]!='P')
ans[q.x][q.y]='*';
}
}
}
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&mv);
getchar();
memset(dp,-1,sizeof(dp));
for(i=0;i<n;i++)
{
gets(map[i]);
for(j=0;map[i][j];j++)
{
if(map[i][j]=='Y')
{
X=i;Y=j;
}
ans[i][j]=map[i][j];
}
ans[i][m]='\0';
}
bfs();
for(i=0;i<n;i++)
puts(ans[i]);
printf("\n");
}
return 0;
}