C语言 良乡足球场 割草机问题

题目要求

良乡足球场有着优质的草坪,为了进一步美化草坪,学校体育部计划使用割草机对草坪进行修剪,进而得到多种多样的图案。由于割草机只能横向或竖向割草,且每次割草都会预先设定高度,割完后会把比设定高度高的草都割成设定的高度。

假设足球场中有一个 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的行列最大,直接判断数组里的每一个数是否是该行最大和该列最大的最小值。(可以证明每个数不是是该行最大就是该列最大,且为这两个最大的较小那个值)

你可能感兴趣的:(算法OJ,c语言,BIT,编程)