【宽搜】ECNA 2015 D Rings (Codeforces GYM 100825)

题目链接:

  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;
}
/*
//

//
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值