题目要求
良乡足球场有着优质的草坪,为了进一步美化草坪,学校体育部计划使用割草机对草坪进行修剪,进而得到多种多样的图案。由于割草机只能横向或竖向割草,且每次割草都会预先设定高度,割完后会把比设定高度高的草都割成设定的高度。
假设足球场中有一个 n * m 的草坪 (1<=n, m<=100),草坪中的草初始高度均为100。现给出一个图案,请通过编程判断割草机是否可以割出想要的图案。
输入
第一行包含两个整数 n 和 m。
接下来为 n 行输入,每行包含 m 个不大于100的正整数。
输出
如果可以修剪成输入的图案,则输出“YES”,否则输出“NO”。
第一种方案:
每次新建一个全为100的数组num2,每次找到输入数组num的行列最大,然后让num2数组按行列最大锄草,最后判断锄草后的数组num2是否和要求数组num相同
代码如下:
#include
#define N 100
int main(int argc, const char * argv[]) {
int m,n,i,j,num[N][N];
while(scanf("%d%d",&n,&m)!=EOF){
int maxC[N],maxR[N],num2[N][N];
memset(maxC,0,sizeof(maxC));
memset(maxR,0,sizeof(maxR));
int flag = 1;
for (i = 0; i < n; i ++) {
for (j = 0; j < m; j++) {
scanf("%d",&num[i][j]);
if (num[i][j] > 100) {
flag = 0;
}
num2[i][j] = 100;
//找到列最大
maxC[j] = maxC[j] > num[i][j]?maxC[j]:num[i][j];
//找到行最大
maxR[i] = maxR[i] > num[i][j]?maxR[i]:num[i][j];
}
}
for (i = 0; i < n; i++) {
for (j = 0;j < m; j++) {
//列(行)锄草,高于列(行)最大的变为列(行)最大,低于的不变
num2[i][j] = num2[i][j] > maxC[j]?maxC[j]:num2[i][j];
num2[i][j] = num2[i][j] > maxR[i]?maxR[i]:num2[i][j];
}
}
//判断锄草后的草是否和要求的草相等
for (i = 0; i < n; i++) {
for (j = 0;j < m; j++) {
if(num[i][j] != num2[i][j]){
flag = 0;
}
}
}
if (flag == 1) {
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
第二种方案:
每次找到输入数组num的行列最大,直接判断数组里的每一个数是否是该行最大和该列最大的最小值。(可以证明每个数不是是该行最大就是该列最大,且为这两个最大的较小那个值)