思路:遇到*时是不应该加进去的,因为他不应该在向四周扩展,这样就需要在处理四个方向的for循环中,也就是push之前进行处理
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=600;
const int INF=1000000000;
char a[maxn][maxn];
int n,m,vis[maxn][maxn];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
struct node
{
int x,y,t;
char id;
};
void solve()
{
queue<node> q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]>='a'&&a[i][j]<='z')q.push((node){i,j,0,a[i][j]});
memset(vis,0,sizeof(vis));
while(!q.empty())
{
node tmp=q.front();q.pop();
if(a[tmp.x][tmp.y]=='*')continue;
for(int i=0;i<4;i++)
{
int tx=tmp.x+dx[i];
int ty=tmp.y+dy[i];
if(tx<1||tx>n||ty<1||ty>m||(a[tx][ty]=='#')||(a[tx][ty]=='*'))continue;
if(a[tx][ty]=='.')
{
a[tx][ty]=tmp.id;
vis[tx][ty]=tmp.t+1;
q.push((node){tx,ty,tmp.t+1,tmp.id});
}
if((tmp.t+1==vis[tx][ty])&&a[tx][ty]!=tmp.id)
a[tx][ty]='*';
}
}
for(int i=1;i<=n;i++)printf("%s\n",a[i]+1);
printf("\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
solve();
}
return 0;
}