#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
char map1[105][105],ans[105][105];
int m,n,mv;
int startx,starty;
int count1[105][105];
int NEXT[4][2]={1,0,0,-1,-1,0,0,1};
struct node
{
int x;
int y;
int s;
}q1,q2;
queue<node>qu;
int calulate(int x1,int y1,int v)
{
int tx,ty,ret;
if( map1[x1][y1]==‘T‘)
ret=v-2;
else if( map1[x1][y1]==‘R‘)
ret=v-3;
else
ret=v-1;
for(int i=0;i<=3;i++)
{
tx=x1+NEXT[i][0];
ty=y1+NEXT[i][1];
if(tx<1||tx>m||ty<1||ty>n)
continue;
if( map1[tx][ty]==‘E‘)
{
if(ret>0)
return 0;
else
return ret;
}
}
return ret;
}
void bfs()
{
q1.x=startx;
q1.y=starty;
q1.s=mv;
qu.push(q1);
count1[startx][starty]=mv;
while(!qu.empty())
{
q1=qu.front();
qu.pop();
if(q1.s==0)
continue;
for(int k=0;k<=3;k++)
{
q2.x=q1.x+NEXT[k][0];
q2.y=q1.y+NEXT[k][1];
if(q2.x<1||q2.x>m||q2.y<1||q2.y>n)
continue;
if( map1[q2.x][q2.y]==‘#‘|| map1[q2.x][q2.y]==‘Y‘|| map1[q2.x][q2.y]==‘E‘)
continue;
q2.s=calulate(q2.x,q2.y,q1.s);
if(q2.s<0)
continue;
if(q2.s>count1[q2.x][q2.y])
{
count1[q2.x][q2.y]=q2.s;
qu.push(q2);
if( map1[q2.x][q2.y]!=‘P‘)
ans[q2.x][q2.y]=‘*‘;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(count1,-1,sizeof(count1));
memset( map1,0,sizeof( map1));
memset(ans,0,sizeof(ans));
scanf("%d%d%d",&m,&n,&mv);
getchar();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%c",&map1[i][j]);
ans[i][j]= map1[i][j];
if( map1[i][j]==‘Y‘)
{
startx=i;
starty=j;
}
}
getchar();
}
bfs();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
printf("%c",ans[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}
原文:http://www.cnblogs.com/13224ACMer/p/4442613.html