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的行列最大,直接判斷數組裏的每一個數是否是該行最大和該列最大的最小值。(可以證明每個數不是是該行最大就是該列最大,且爲這兩個最大的較小那個值)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章