Educational Codeforces Round 5 C. The Labyrinth (DFS **)

C. The Labyrinth
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given a rectangular field of n × m cells. Each cell is either empty or impassable (contains an obstacle). Empty cells are marked with '.', impassable cells are marked with '*'. Let's call two empty cellsadjacent if they share a side.

Let's call a connected component any non-extendible set of cells such that any two of them are connected by the path of adjacent cells. It is a typical well-known definition of a connected component.

For each impassable cell (x, y) imagine that it is an empty cell (all other cells remain unchanged) and find the size (the number of cells) of the connected component which contains(x, y). You should do it for each impassable cell independently.

The answer should be printed as a matrix with n rows andm columns. Thej-th symbol of thei-th row should be "." if the cell is empty at the start. Otherwise thej-th symbol of the i-th row should contain the only digit —- the answer modulo10. The matrix should be printed without any spaces.

To make your output faster it is recommended to build the output as an array ofn strings having lengthm and print it as a sequence of lines. It will be much faster than writing character-by-character.

As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to usescanf/printf instead ofcin/cout in C++, prefer to use BufferedReader/PrintWriter instead ofScanner/System.out inJava.

Input

The first line contains two integers n, m (1 ≤ n, m ≤ 1000) — the number of rows and columns in the field.

Each of the next n lines contains m symbols: "." for empty cells, "*" for impassable cells.

Output

Print the answer as a matrix as described above. See the examples to precise the format of the output.

Sample test(s)
Input
3 3
*.*
.*.
*.*
Output
3.3
.5.
3.3
Input
4 5
**..*
..***
.*.*.
*.*.*
Output
46..3
..732
.6.4.
5.4.3
Note

In first example, if we imagine that the central cell is empty then it will be included to component of size5 (cross). If any of the corner cell will be empty then it will be included to component of size3 (corner).



题意:给你一个地图,让你寻找'*'周围'.'的个数,相互连接也算,结果对10取余


思路:对每一个'.'进行搜索,途中进行标记属于哪个集团,然后将一个集团的点加入队列,最后为其赋值,值为集团点数,最后检查每个'*'所属集团的异同。


总结:判断所属集团异同的时候WA了几次,也是醉了。



ac代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define MAXN 1001000
#define LL long long
#define ll __int64
#define INF 0x7fffffff
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
#define mod 1000000007
using namespace std;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[1010][1010];
int v[1010][1010];
int cnt[1010][1010];
int vv;
int n,m;
int num;
struct s
{
	int a,b;
};
queue<s>q;
int check(int x,int y)
{
	if(x<0||x>=n||y<0||y>=m||v[x][y]||map[x][y]=='*')
	return 0;
	return 1;
}
void dfs(int x,int y)
{
	num++;
	v[x][y]=vv;
	for(int i=0;i<4;i++)
	{
		int nx=x+dir[i][0];
		int ny=y+dir[i][1];
		if(check(nx,ny))
		{
			s bb;
			bb.a=nx;bb.b=ny;q.push(bb);
			dfs(nx,ny);
		}
	}
}
int main()
{
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=0;i<n;i++)
		scanf("%s",map[i]);
//		for(i=0;i<n;i++)
//		printf("%s\n",map[i]);
		vv=1;mem(cnt);mem(v);
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(map[i][j]=='*'||v[i][j])
				continue;
				num=0;
				dfs(i,j);
				//printf("%d\n",vv);
				cnt[i][j]=num;
				vv++;
				while(!q.empty())
				{
					s aa=q.front();
					q.pop();
					cnt[aa.a][aa.b]=cnt[i][j];
				}
				
			}
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(map[i][j]=='.')
				printf(".");
				else//就是这WA了几次
				{
					int ccnt=1;
					int aa[5];
					int cc=0;
					for(int w=0;w<4;w++)
					{
						int nx=i+dir[w][0];
						int ny=j+dir[w][1];
						if(nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny]=='.')
						{
							int bz=0;
							for(int e=0;e<cc;e++)
							{
								if(aa[e]==v[nx][ny])
								{
									bz=1;
									break;
								}
							}
							if(bz==0)
							{
								aa[cc++]=v[nx][ny];
								ccnt+=cnt[nx][ny];
							}
						}
					}
					ccnt=ccnt%10;
					printf("%d",ccnt);
				}
			}
			printf("\n");
		}
	}
	return 0;
}



你可能感兴趣的:(Educational Codeforces Round 5 C. The Labyrinth (DFS **))