有一个n*m的草坪(1<=n,m<=100),草坪中的草原来的高度都是100。现在使用割草机修剪草坪,来得到各种各样的图案。割草机只 能横着或者竖着割草。每次割草都会先设定一个高度,割完之后会把比设定高度高的草都割成设定的高度。比如草原来是5 2 8,设定高度为4,那么割完之后就变成了4 2 4。
现在给出一个图案,问是否可以把草坪割成图案的样子。
输入第一行包含两个整数n和m。
接下来为n行输入,每行包含m个不大于100的正整数。
如果可以修剪成输入的图案,则输出“YES”,否则输出“NO”。
测试用例:
测试输入:
3 3 2 1 2 1 1 1 2 1 2
测试输出:
YES
题解
由于割草机每次只能割一行或一列,所以,对于任意一个数组中的元素a[i][j],他都是第i行或者第j列的最大值,所以只需要判断每个元素是不是他所在行或列的最大值即可
ac代码:
#include<stdio.h>
#include<string.h>
int main()
{
int map[105][105],i,j,k,tag=1,tag1,tag2;
int n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]>100)
tag=0;
}
if(tag==0) printf("NO\n");
else
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
for(k=1;k<=m;k++)
if(map[i][j]>=map[i][k])
{
tag1=1;
continue;
}
else
{
tag1=0;
break;
}
for(k=1;k<=n;k++)
if(map[i][j]>=map[k][j])
{
tag2=1;
continue;
}
else
{
tag2=0;
break;
}
tag=tag1+tag2;
if(tag==0) goto ll;
}
ll: ;
if(tag==0) printf("NO\n");
else printf("YES\n");
}
return 0;
}