您的位置:首页 > 其它

修剪草坪

2016-05-04 22:46 363 查看
问题描述

有一个n*m的草坪(1<=n,m<=100),草坪中的草原来的高度都是100。现在使用割草机修剪草坪,来得到各种各样的图案。割草机只 能横着或者竖着割草。每次割草都会先设定一个高度,割完之后会把比设定高度高的草都割成设定的高度。比如草原来是5
2 8,设定高度为4,那么割完之后就变成了4 2 4。

现在给出一个图案,问是否可以把草坪割成图案的样子。

输入第一行包含两个整数n和m。

接下来为n行输入,每行包含m个不大于100的正整数。

如果可以修剪成输入的图案,则输出“YES”,否则输出“NO”。

测试输入

期待的输出

时间限制

内存限制

额外进程

测试用例 1以文本方式显示

3 3↵
2 1 2↵
1 1 1↵
2 1 2↵

以文本方式显示

YES↵

1秒64M0
题解思路

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

实现代码

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: