修剪草坪

本文介绍了一道关于通过割草机修剪草坪达到特定图案的算法题目。详细解析了问题背景、输入输出要求及时间、内存限制,并给出了实现代码与解题思路。核心在于检查每个目标高度是否同时为所在行和列的最大值。

问题描述


有一个n*m的草坪(1<=n,m<=100),草坪中的草原来的高度都是100。现在使用割草机修剪草坪,来得到各种各样的图案。割草机只 能横着或者竖着割草。每次割草都会先设定一个高度,割完之后会把比设定高度高的草都割成设定的高度。比如草原来是5 2 8,设定高度为4,那么割完之后就变成了4 2 4。
现在给出一个图案,问是否可以把草坪割成图案的样子。
输入第一行包含两个整数n和m。
接下来为n行输入,每行包含m个不大于100的正整数。
如果可以修剪成输入的图案,则输出“YES”,否则输出“NO”。


测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 3 3↵
  2. 2 1 2↵
  3. 1 1 1↵
  4. 2 1 2↵
以文本方式显示
  1. YES↵
1秒 64M 0
题解思路

存在解的条件是,对于每一个要修剪成的高度来说,他必为其所对应行和列的最大值。原因在于,如果他不是所在行和列的最大值,那么为了修剪到该高度就必须要破坏所在行和列的高度,这是不满足题意的。所以本题只需要求出该矩阵每行每列的最大值,比较即可。


实现代码


<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
int main()
{
	int n,m;
	int i,j,temp=1;
	int a[101][101],b[101][101];
	
	scanf("%d%d",&n,&m); 
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	
	for(i=0;i<n;i++)
	{
		b[i][0]=a[i][0];
	 	for(j=1;j<m;j++)
		 {
	 		if(a[i][j]>b[i][0]) //找到每一行的最大值 
	 		{
	 			b[i][0]=a[i][j];
	 		}
	 		
	 	 }	
	}
	for(i=0;i<m;i++)
	{
		b[i][1]=a[0][i];
	 	for(j=1;j<n;j++)
		 {
	 		if(a[j][i]>b[i][1]) //找到每一列的最大值 
	 		{
	 			b[i][1]=a[j][i];
	 		}
	 		
	 	 }	
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			if(b[i][0]>a[i][j]&&b[j][1]>a[i][j])   //判断 
			{
				temp=0;
				break;
			}
		}
	} 
	if(temp==1)
	{
		printf("YES\n");
	}
	else
		printf("NO\n");
	
	return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值