2.修剪草坪
有一个n*m的草坪(1<=n,m<=100),草坪中的草原来的高度都是100。现在使用割草机修剪草坪,来得到各种各样的图案。割草机只能横着或者竖着割草。每次割草都会先设定一个高度,割完之后会把比设定高度高的草都割成设定的高度。比如草原来是5 2 8,设定高度为4,那么割完之后就变成了4 2 4。
现在给出一个图案,问是否可以把草坪割成图案的样子。
输入第一行包含两个整数n和m。
接下来为n行输入,每行包含m个不大于100的正整数。
如果可以修剪成输入的图案,则输出“YES”,否则输出“NO”。
分析:得到规律:草坪上的每一个高度要是其所在行或者所在列的最大值,才能是YES,否则是NO。
#include<stdio.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m,flag;
int map[105][105];
int m1[105][105],m2[105][105];
int _min[105];
while(scanf("%d%d",&n,&m)!=EOF){
flag = 1;
for (int i = 0; i < 105; i++)
_min[i] = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
scanf("%d",&map[i][j]);
_min[i] = max(_min[i],map[i][j]);
m1[i][j] = m2[i][j] = 0;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if(map[i][j] == _min[i])
m1[i][j] = 1;
}
for (int i = 0; i < 105; i++)
_min[i] = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
_min[i] = max(_min[i],map[j][i]);
}
for (int i = 0; i < m && flag; i++)
for (int j = 0; j < n && flag; j++)
{
if(map[j][i] == _min[i])
m2[j][i] = 1;
if(m2[j][i]==0 && m1[j][i]==0)
flag = 0;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}