解题思路:
这思路是优质题解的思路https://blog.dotcpp.com/a/8945

思路如下

①:若某陆地上下左右其中有一个是水域,则该陆地到水域的最短距离一定为1

②:两个点的距离为x坐标相减的差得绝对值与y坐标相减差的绝对值之和

③:把所有水域的坐标保存起来,用②距离公式求出距离选最小一个

④:输出结果

其中最重要的是②

注意事项:
记得要更新距离
参考代码:

#include<iostream>
using namespace std;
int n,m;
struct Waters
{
	int x,y;
};
Waters waters[10001];
int cnt;
int min(int x,int y)
{
	return x<y?x:y;
}
int main()
{
	char a[101][102];
	int distance;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>a[i][j];
			
			/*保存水域*/
			
			if(a[i][j]=='0')
			{
				waters[cnt].x=i;
				waters[cnt++].y=j;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0,minn=-1;j<m;j++)
		{
			if(a[i][j]=='0')
			{
				cout<<0<<" ";
				continue;
			}
			distance=999999999;					//记得要更新 
			
			/*遍历每一个水域,保存最小距离的*/
			
			for(int w=0,co,ro;w<cnt;w++)
			{
				co=waters[w].x-i;
				ro=waters[w].y-j;
				if(co<0)co*=-1;
				if(ro<0)ro*=-1;
				distance=min(distance,co+ro);
			}
			cout<<distance<<" ";
		}
		cout<<"\n";
	}

	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论