PAT (Basic Level) Practice 1066 圖像過濾 (15 分)

題目:圖像過濾是把圖像中不重要的像素都染成背景色,使得重要部分被凸顯出來。現給定一幅黑白圖像,要求你將灰度值位於某指定區間內的所有像素顏色都用一種指定的顏色替換。

輸入格式:
輸入在第一行給出一幅圖像的分辨率,即兩個正整數 M 和 N(0<M,N≤500),另外是待過濾的灰度值區間端點 A 和 B(0≤A<B≤255)、以及指定的替換灰度值。隨後 M 行,每行給出 N 個像素點的灰度值,其間以空格分隔。所有灰度值都在 [0, 255] 區間內。

輸出格式:
輸出按要求過濾後的圖像。即輸出 M 行,每行 N 個像素灰度值,每個灰度值佔 3 位(例如黑色要顯示爲 000),其間以一個空格分隔。行首尾不得有多餘空格。

輸入樣例:
3 5 100 150 0
3 189 254 101 119
150 233 151 99 100
88 123 149 0 255
輸出樣例:
003 189 254 000 000
000 233 151 099 000
088 000 000 000 255
解題第一思路是運用數組來存放並進行後續操作,但動手之前看到一篇博客(柳婼 の blog),這位博主採用邊輸入邊判斷並輸出,代碼也很簡潔短小,於是模仿其代碼,下面是這位博主的源代碼:

#include <iostream>
using namespace std;
int main() {
    int m, n, a, b, num, temp;
    scanf("%d%d%d%d%d", &m, &n, &a, &b, &num);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &temp);
            if (temp >= a && temp <= b)
                temp = num;
            if (j != 0) printf(" ");
            printf("%03d", temp);
        }
        printf("\n");
    }
    return 0;
}

我自己的觀後代碼(幾乎沒改動,哈哈,看了短小簡潔的代碼便不想再寫自己的原想法):

#include<iostream>
using namespace std;
int main()
{
int m,n,a,b,num,gray;
cin>>m>>n>>a>>b>>num;
for(int i=0;i<m;i++)
{
    for(int j=0;j<n;j++)
    {
        scanf("%d", &gray);//cin>>gray;
        if(gray>=a && gray<=b)
        gray=num;
        //printf(" %03d",gray);題目要求行首尾不得有多餘空格,不可直接在控制符前加空格
        if(j!=0) cout<<" ";//除行首打印空格
        printf("%03d",gray);
    }
   // cout<<endl; 
   printf("\n");
}
return 0;
}

很奇怪的是,我用自己的代碼提交,在第三個測試點總是提示運行超時,將代碼的註釋部分改
成 c 的輸入輸出形式,卻運行通過了,不清楚爲何這樣一改就能讓運行時間減少。。。

由於printf有域寬輸出控制,所以輸出列沒有采用cout。

好吧,第一次記錄刷題過程,有點不熟練,還請海涵。

鏈接: [link](https://www.liuchuo.net/archives/3747) .//這是該博主的博客頁面。

發佈了9 篇原創文章 · 獲贊 18 · 訪問量 3705
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章