PAT-B 1068. 萬綠叢中一點(diǎn)紅(20)

傳送門

https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184

題目

對(duì)于計(jì)算機(jī)而言,顏色不過是像素點(diǎn)對(duì)應(yīng)的一個(gè)24位的數(shù)值×ぬ叮現(xiàn)給定一幅分辨率為MxN的畫特碳,要求你找出萬綠叢中的一點(diǎn)紅入篮,即有獨(dú)一無二顏色的那個(gè)像素點(diǎn)进副,并且該點(diǎn)的顏色與其周圍8個(gè)相鄰像素的顏色差充分大民轴。
輸入格式:
輸入第一行給出三個(gè)正整數(shù)解滓,分別是M和N(<= 1000)咱士,即圖像的分辨率立由;以及TOL轧钓,是所求像素點(diǎn)與相鄰點(diǎn)的顏色差閾值,色差超過TOL的點(diǎn)才被考慮锐膜。隨后N行毕箍,每行給出M個(gè)像素的顏色值,范圍在[0, 224)內(nèi)道盏。所有同行數(shù)字間用空格或TAB分開而柑。
輸出格式:
在一行中按照“(x, y): color”的格式輸出所求像素點(diǎn)的位置以及顏色值,其中位置x和y分別是該像素在圖像矩陣中的列荷逞、行編號(hào)(從1開始編號(hào))牺堰。如果這樣的點(diǎn)不唯一,則輸出“Not Unique”颅围;如果這樣的點(diǎn)不存在,則輸出“Not Exist”恨搓。
輸入樣例1:
8 6 200
由于這里不直觀院促,直接放個(gè)表格上來:

0 0 0 0 0 0 0 0
65280 65280 65280 16711479 65280 65280 65280 65280
16711479 65280 65280 65280 16711680 65280 65280 65280
65280 65280 65280 65280 65280 65280 165280 165280
65280 65280 16777015 65280 65280 165280 65480 165280
16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215

輸出樣例1:
(5, 3): 16711680
輸入樣例2:
4 5 2
0 0 0 0
0 0 3 0
0 0 0 0
0 5 0 0
0 0 0 0
輸出樣例2:
Not Unique
輸入樣例3:
3 3 5
1 2 3
3 4 5
5 6 7
輸出樣例3:
Not Exist

分析

很煩的一題,改了好多次都沒過斧抱,參考了各種代碼常拓,最后才知道坑在哪里,下面讓我來簡(jiǎn)單說一下辉浦。

首先要寫個(gè)判斷“一點(diǎn)紅”的函數(shù)弄抬,我那個(gè)方法寫的很直觀很好懂(其實(shí)是有點(diǎn)low,哈哈人艱不拆)宪郊。

接著要有一個(gè)判重的方法來判斷數(shù)字是否重復(fù)掂恕,如果不重復(fù)并且滿足“一點(diǎn)紅”的條件才符合。

此條見題中原句:

對(duì)于計(jì)算機(jī)而言弛槐,顏色不過是像素點(diǎn)對(duì)應(yīng)的一個(gè)24位的數(shù)值“猛觯現(xiàn)給定一幅分辨率為MxN的畫,要求你找出萬綠叢中的一點(diǎn)紅乎串,即有獨(dú)一無二顏色的那個(gè)像素點(diǎn)店枣,并且該點(diǎn)的顏色與其周圍8個(gè)相鄰像素的顏色差充分大。

覺得好坑是嗎叹誉?是的鸯两,跟上我的腳步,后面還有更坑的长豁。

代碼寫到目前為止钧唐,我天真的以為應(yīng)該就可以A了,但是我萬萬沒想到的是蕉斜,問題出在了我的遍歷方法逾柿。

剛才的題目中提到“周圍8個(gè)相鄰像素的顏色”缀棍,所以我很自然認(rèn)為,最上机错、最左爬范、最右、最下這四列弱匪,由于附近的像素構(gòu)成不了8個(gè)青瀑,故舍去,但是這樣的結(jié)果是兩個(gè)檢查點(diǎn)通過不了萧诫。

參考了網(wǎng)上各類代碼后斥难,發(fā)現(xiàn)成功的解法與我的解法的差別就在于對(duì)四個(gè)邊元素的驗(yàn)證,只要對(duì)其進(jìn)行驗(yàn)證帘饶,題目就能A掉哑诊,于是我給輸入的數(shù)組四周補(bǔ)上了0,然后將四個(gè)邊上的數(shù)也進(jìn)行驗(yàn)證后及刻,就通過了這道題镀裤,類似下圖。

0 0 0 0 0
0 x x x 0
0 x x x 0
0 x x x 0
0 0 0 0 0

這就是我解題時(shí)遇到的各種問題缴饭,希望能解決大家的疑問暑劝。

源代碼

//C/C++實(shí)現(xiàn)
#include <iostream>
#include <vector>
#include <cmath>
#include <map>

using namespace std;

bool isRed(int i, int j, vector<vector<int> > v, int tol){
    if (abs(v[i - 1][j - 1] - v[i][j]) <= tol){ // 左上角
        return false;
    }
    if (abs(v[i][j - 1] - v[i][j]) <= tol){ // 上
        return false;
    }
    if (abs(v[i + 1][j - 1] - v[i][j]) <= tol){ // 右上角
        return false;
    }
    if (abs(v[i + 1][j] - v[i][j]) <= tol){ // 右
        return false;
    }
    if (abs(v[i + 1][j + 1] - v[i][j]) <= tol){ // 右下角
        return false;
    }
    if (abs(v[i][j + 1] - v[i][j]) <= tol){ // 下
        return false;
    }
    if (abs(v[i - 1][j + 1] - v[i][j]) <= tol){ // 左下角
        return false;
    }
    if (abs(v[i - 1][j] - v[i][j]) <= tol){ // 左
        return false;
    }
    return true;
}

vector<vector<int> > v;

int main(){
    int m, n, tol;
    scanf("%d %d %d", &m, &n, &tol);
    // n行m列二維數(shù)組
    v.resize(n + 2);
    for (int i = 0; i < n + 2; ++i){
        v[i].resize(m + 2);
    }
    map<int, int> isRepeat;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            scanf("%d", &v[i][j]);
            ++isRepeat[v[i][j]];
        }
    }
    int cnt = 0;
    int resI, resJ;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            if (isRepeat[v[i][j]] == 1){ // 只出現(xiàn)過一次
                if (isRed(i, j, v, tol)){
                    ++cnt;
                    resI = i;
                    resJ = j;
                    if (cnt == 2){
                        break;
                    }
                }
            }
        }
        if (cnt == 2){
            break;
        }
    }
    if (cnt == 0){
        printf("Not Exist\n");
    }
    else if (cnt == 1){
        printf("(%d, %d): %d\n", resJ, resI, v[resI][resJ]);
    }
    else if (cnt == 2){
        printf("Not Unique\n");
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颗搂,隨后出現(xiàn)的幾起案子担猛,更是在濱河造成了極大的恐慌,老刑警劉巖丢氢,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅联,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疚察,警方通過查閱死者的電腦和手機(jī)纺且,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稍浆,“玉大人载碌,你說我怎么就攤上這事⌒品悖” “怎么了嫁艇?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弦撩。 經(jīng)常有香客問我步咪,道長(zhǎng),這世上最難降的妖魔是什么益楼? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任猾漫,我火速辦了婚禮点晴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悯周。我一直安慰自己粒督,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布禽翼。 她就那樣靜靜地躺著屠橄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闰挡。 梳的紋絲不亂的頭發(fā)上锐墙,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音长酗,去河邊找鬼溪北。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夺脾,可吹牛的內(nèi)容都是我干的刻盐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼劳翰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了馒疹?” 一聲冷哼從身側(cè)響起佳簸,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颖变,沒想到半個(gè)月后生均,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腥刹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年马胧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衔峰。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佩脊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垫卤,到底是詐尸還是另有隱情威彰,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布穴肘,位于F島的核電站歇盼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏评抚。R本人自食惡果不足惜豹缀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一伯复、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邢笙,春花似錦啸如、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筐骇,卻和暖如春债鸡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铛纬。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工厌均, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人告唆。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓棺弊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親擒悬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子模她,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容