题目链接:
http://codeforces.com/gym/100825
题目大意:
给你一张N*N(N<=100)的图表示一个树桩,'T'为年轮,'.'为空,求每个'T'属于哪一圈年轮,空的为'.',如果最内圈<10,每个格子用两位表示,否则用三位,不足的用'.'补足。
题目思路:
【宽搜】
初始所有点标记为INF,先将图上所有的'.'标记为0,边缘如果有'T'记为1,并把'.'和边缘所有的点加入队列,接下来一个一个上下左右扩展并更新答案,没进队的进队。最后输出。
//
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-10)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define N 104
#define M 10004
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans;
int q[M][2];
int a[N][N];
bool u[N][N];
char s[N][N];
void spfa()
{
int x,y,l=0,r=cas;
while(l!=r)
{
x=q[l=(l+1)%M][0],y=q[l][1];
cass=max(cass,a[x][y]);
u[x][y]=0;
if(x+1<=n && a[x+1][y]>a[x][y]+1)
{
q[r=(r+1)%M][0]=x+1,q[r][1]=y;
u[x+1][y]=1;
a[x+1][y]=a[x][y]+1;
}
if(y+1<=m && a[x][y+1]>a[x][y]+1)
{
q[r=(r+1)%M][0]=x,q[r][1]=y+1;
u[x][y+1]=1;
a[x][y+1]=a[x][y]+1;
}
if(x-1>0 && a[x-1][y]>a[x][y]+1)
{
q[r=(r+1)%M][0]=x-1,q[r][1]=y;
u[x-1][y]=1;
a[x-1][y]=a[x][y]+1;
}
if(y-1>0 && a[x][y-1]>a[x][y]+1)
{
q[r=(r+1)%M][0]=x,q[r][1]=y-1;
u[x][y-1]=1;
a[x][y-1]=a[x][y]+1;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int x,y,z;
// init();
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(~scanf("%d",&n))
{
cas=0;cass=0;mem(u,0);mem(a,MAX);
scanf("%d",&m);
for(i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
for(j=1;j<=m;j++)
{
if(s[i][j]=='.')
{
q[++cas][0]=i,q[cas][1]=j;
a[i][j]=0;
}
else if(i==1 || i==n || j==1 || j==m)
{
q[++cas][0]=i,q[cas][1]=j;
a[i][j]=1;
}
}
}
spfa();
/*
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
printf("%d ",a[i][j]);
puts("");
}
*/
if(cass<10)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf(".");
if(a[i][j]==0)printf(".");
else printf("%d",a[i][j]);
}
puts("");
}
}
else
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf(".");
if(a[i][j]==0)printf("..");
else if(a[i][j]<10)printf(".%d",a[i][j]);
else printf("%d",a[i][j]);
}
puts("");
}
}
}
return 0;
}
/*
//
//
*/