題目要求
良鄉足球場有着優質的草坪,爲了進一步美化草坪,學校體育部計劃使用割草機對草坪進行修剪,進而得到多種多樣的圖案。由於割草機只能橫向或豎向割草,且每次割草都會預先設定高度,割完後會把比設定高度高的草都割成設定的高度。
假設足球場中有一個 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的行列最大,直接判斷數組裏的每一個數是否是該行最大和該列最大的最小值。(可以證明每個數不是是該行最大就是該列最大,且爲這兩個最大的較小那個值)