【简便解法】1068 万绿丛中一点红 (20分)
立志用更少的代碼做更高效的表達
Pat乙級最優化代碼+題解+分析匯總——>傳送門
對于計算機而言,顏色不過是像素點對應的一個 24 位的數值。現給定一幅分辨率為 M×N 的畫,要求你找出萬綠叢中的一點紅,即有獨一無二顏色的那個像素點,并且該點的顏色與其周圍 8 個相鄰像素的顏色差充分大。
輸入格式:
輸入第一行給出三個正整數,分別是 M 和 N(≤ 1000),即圖像的分辨率;以及 TOL,是所求像素點與相鄰點的顏色差閾值,色差超過 TOL 的點才被考慮。隨后 N 行,每行給出 M 個像素的顏色值,范圍在 [0,2^24) 內。所有同行數字間用空格或 TAB 分開。
輸出格式:
在一行中按照 (x, y): color 的格式輸出所求像素點的位置以及顏色值,其中位置 x 和 y 分別是該像素在圖像矩陣中的列、行編號(從 1 開始編號)。如果這樣的點不唯一,則輸出 Not Unique;如果這樣的點不存在,則輸出 Not Exist。
輸入樣例 1:
8 6 200
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
解析
題意:找到一個點,該點只出現過一次,并且它周圍的點與它差值的絕對值都大于TOL。 若有多個,則輸出Not Unique,若沒有,則輸出Not Exist
分析:本題拆分了來看,一共有兩大部分
1、判重:這里我采用unordered_map(哈希映射)實現
2、判斷周圍的點與它的差值:有點類似于搜索迷宮,定義八個方向,判斷越界和是否滿足TOL, 累計即可。
#include<bits/stdc++.h> using namespace std; int Next[8][2] = {{0,1}, {0,-1}, {1,0}, {-1,0},{1,1}, {1,-1}, {-1,1}, {-1,-1}}; int main() {int col, row, TOL;cin >> col >> row >> TOL;int a[row][col] = {0};unordered_map<int, int>m;vector<int>v;for(int i = 0; i < row; i++) { //輸入+判斷是否獨一無二 for(int j = 0; j < col; j++) {cin >> a[i][j];v.push_back(a[i][j]); m[a[i][j]]++; }}int ii = 0, jj = 0, num1 = 0;for(int i = 0; i < row; i++) {for(int j = 0; j < col; j++) {bool flag = false;for(int k = 0; k < 8; k++) {int x1 = i+Next[k][0];int y1 = j+Next[k][1];if(x1<0 || y1<0 || x1>row || y1>row) continue; //如果越界 if(abs(a[x1][y1] - a[i][j]) <= TOL || m[a[i][j]]>1) {//如果不滿足分辨率或出現次數大于1 flag = true; break;}}if(flag == false) {ii = i; jj = j; num1++;}}}if(num1 == 0) printf("Not Exist\n");else if(num1 == 1) printf("(%d, %d): %d\n", jj+1, ii+1, a[ii][jj]);else printf("Not Unique\n");return 0; }
耗時
每日一句
唯有經歷過櫛風沐雨般的人生,方能顯得淡定從容。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的【简便解法】1068 万绿丛中一点红 (20分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【已解决】[Error] referen
- 下一篇: 【最简便解法】1069 微博转发抽奖 (