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

来源:互联网 发布:皮尔斯生涯数据 编辑:程序博客网 时间:2024/05/01 05:28

题目要求

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

假设足球场中有一个 n * m 的草坪 (1<=n, m<=100),草坪中的草初始高度均为100。现给出一个图案,请通过编程判断割草机是否可以割出想要的图案。

输入

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

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

输出

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

第一种方案:

每次新建一个全为100的数组num2,每次找到输入数组num的行列最大,然后让num2数组按行列最大锄草,最后判断锄草后的数组num2是否和要求数组num相同

代码如下:

#include #define N 100int 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的行列最大,直接判断数组里的每一个数是否是该行最大和该列最大的最小值。(可以证明每个数不是是该行最大就是该列最大,且为这两个最大的较小那个值)

0 0
原创粉丝点击