记录编号 80647 评测结果 AAAAAAAAAAAAAAAA
题目名称 [POI 1999] 位图 最终得分 100
用户昵称 GravatarMongo 是否通过 通过
代码语言 C++ 运行时间 3.447 s
提交时间 2013-11-07 14:24:06 内存使用 3.81 MiB
显示代码纯文本
//#define lgg
#include <fstream>
#include <cmath>
#ifdef lgg
#include <iostream>
#endif
#define MAX 3000000
using namespace std;
int M, N;
char table[182][183];
int x[33124], y[33124], xx[33124], yy[33124], size, _size, dis[182][182];
inline int min(int a, int b)
{
	return a<b?a:b;
}
int main()
{
	ifstream in ("bit.in");
	ofstream out("bit.out");
	in >> N >> M;
	for(int i(0); i<N; ++i)
		for(int j(0); j<M; ++j)
			dis[i][j]=MAX;
	for(int i(0); i<N; ++i)
		in >> table[i];
	for(int i(0); i<N; ++i)
	{
		for(int j(0); j<M; ++j)
		{
			table[i][j]-='0';
			if(table[i][j]==1)
			{
				x[size]=i, y[size]=j; ++size;
				dis[i][j]=0;
			}
		}
	}
	for(int a(0); a<size; ++a)
	{
		int i(x[a]), j(y[a]);
		if(table[i][j] && table[i-1][j] && table[i][j-1] && table[i][j+1] && table[i+1][j])continue;
		xx[_size]=i; yy[_size]=j; ++_size;
	}
	for(int i(0); i<_size; ++i)
	{
		int x1(xx[i]), y1(yy[i]);
		for(int a(0); a<N; ++a)
			for(int b(0); b<M; ++b)
			{
				if(table[a][b]==0)
					dis[a][b]=min(dis[a][b], abs(x1-a)+abs(y1-b));
			}
	}
	for(int i(0); i<N; ++i)
	{
		for(int j(0); j<M; ++j)
			out << dis[i][j] << ' ';
		out << endl;
	}
	return 0;
}