solution-sp206

题解 SP206 【BITMAP - Bitmap】

原题

此题暴力其实就可以水掉,甚至不需要搜索。

看一看数据:

1 <= n <= 182,1 <= m <= 182

还有时间限制:

时间限制 | 内存限制

\(\quad\;\)4.00s | 1.46GB

/ts

我们用一个vector存储所有1的位置,这样只要1的个数不是很多,就不会T飞。

代码

// 此处应有头文件 
const int N = 2e2 + 10;
int t;
int n,m;
char a[N][N];
struct node
{
	int x,y;
};
vector<node> s;
int distance(int sx , int sy , int fx , int fy) // 曼哈顿距离 
{
	return abs(sx - fx) + abs(sy - fy);
}
int main()
{
	cin >> t;
	while(t--)
	{
		s.clear(); // 别忘了清空vector 
		cin >> n >> m;
		for(int i = 1;i <= n;i++)
			for(int j = 1;j <= m;j++)
			{
				cin >> a[i][j];
				if(a[i][j] == '1')
					s.push_back( (node){i , j} ); // 把1的位置存入vector 
			}
		for(int i = 1;i <= n;i++)
		{
			for(int j = 1;j <= m;j++)
			{
				if(a[i][j] == '1') // 一个小小的优化,防止被全1的数据卡飞 
				{
					cout << "0 ";
					continue;
				}
				int minn = 1 << 30; // 2 ^ 30
				for(int k = 0;k < s.size();k++)
					minn = min(distance(i , j , s[k].x , s[k].y) , minn); // 统计出最小距离 
				cout << minn << " ";
			}
			endline;
		}
	}
    return 0;
}

posted @ 2024-03-06 16:55  iorit  阅读(21)  评论(0)    收藏  举报