description
對於計算機而言,顏色不過是畫素點對應的乙個 24 位的數值。現給定一幅解析度為 m×n 的畫,要求你找出萬綠叢中的一點紅,即有獨一無二顏色的那個畫素點,並且該點的顏色與其周圍所有相鄰畫素的顏色差充分大。
input
輸入第一行給出三個正整數,分別是 m 和 n(≤ 1000),即影象的解析度;以及 tol,是所求畫素點與相鄰點的顏色差閾值,色差超過 tol 的點才被考慮。隨後 n 行,每行給出 m 個畫素的顏色值,範圍在 [0,2 24 ) 內。所有同行數字間用空格或 tab 分開。
output
在一行中按照 (x, y): color 的格式輸出所求畫素點的位置以及顏色值,其中位置 x 和 y 分別是該畫素在影象矩陣中的列、行編號(從 1 開始編號)。如果這樣的點不唯一,則輸出 not unique;如果這樣的點不存在,則輸出 not exist。
參考程式
#滿分程式
m,n,tol=
map(
int,
input()
.split())
graph=
ans=
color_dict=
defjudge
(i,j,m,n)
:if i>=
0and i<=n-
1and j>=
0and j<=m-1:
return
true
else
:return
false
for i in
range
(n):
tmp=
list
(map
(int
,input()
.split())
)for j in tmp:
try:
color_dict[j]+=1
except
: color_dict[j]=1
for i in
range
(n):
for j in
range
(m):
if color_dict[graph[i]
[j]]!=1
:continue
#下面測試(i,j)的8個鄰居
if judge(i-
1,j-
1,m,n)
:#鄰居點是合法的
ifabs
(graph[i]
[j]-graph[i-1]
[j-1])
<=tol:
#色差不滿足條件
continue
else
:pass
#不合法則不考慮該鄰居,換乙個鄰居
if judge(i-
1,j,m,n):if
abs(graph[i]
[j]-graph[i-1]
[j])
<=tol:
continue
else
:pass
if judge(i-
1,j+
1,m,n):if
abs(graph[i]
[j]-graph[i-1]
[j+1])
<=tol:
continue
else
:pass
if judge(i,j-
1,m,n):if
abs(graph[i]
[j]-graph[i]
[j-1])
<=tol:
continue
else
:pass
if judge(i,j+
1,m,n):if
abs(graph[i]
[j]-graph[i]
[j+1])
<=tol:
continue
else
:pass
if judge(i+
1,j-
1,m,n):if
abs(graph[i]
[j]-graph[i+1]
[j-1])
<=tol:
continue
else
:pass
if judge(i+
1,j,m,n):if
abs(graph[i]
[j]-graph[i+1]
[j])
<=tol:
continue
else
:pass
if judge(i+
1,j+
1,m,n):if
abs(graph[i]
[j]-graph[i+1]
[j+1])
<=tol:
continue
else
:pass
[j+1
,i+1
,graph[i]
[j]])if
len(ans)==0
:print
("not exist"
)elif
len(ans)==1
:print
("(, ): "
.format
(ans[0]
[0],ans[0]
[1],ans[0]
[2])
)else
:print
("not unique"
)
分析:
本題為pat (basic level)1068題。從本題的程式設計技術或演算法設計角度來說,並不難,只是通過全部測試樣例,需要格外注意審題,理解題目和給出的測試樣例。我結合csdn上其他大佬的解題經驗以及個人體會,總結出以下幾點需要注意的地方:
①糾正原題的描述:「該點的顏色與其周圍 8 個相鄰畫素的顏色差充分大」,應改為「該點的顏色與其周圍所有相鄰畫素的顏色差充分大」,應考慮最外圍的資料。也有可能是目標點;
②充分理解「獨一無二」:這個含義是指,可能存在某個點,它的所有鄰居點的畫素都滿足這個「色差」要求,但是這個點的畫素(顏色)在整個矩陣**現不止一次,那麼它就不是獨一無二的,因此這樣的點不是目標點;
③如何判斷是否獨一無二:建立字典,在輸入資料的同時對每個顏色值統計次數,字典的鍵:值關係是,顏色值:出現的次數,這樣檢索較快,也不占用太大空間。
在這裡還有乙個技巧,就是更新字典時,善用異常處理機制也能給提高效率!判斷顏色是否存在於字典中的鍵時,可以不用in關鍵字判斷,直接交給鍵查詢異常keyerror來處理!(無異常說明鍵存在,則更新值,有異常則建立鍵)
如果將輸入的顏色平鋪成一位陣列(n×m個資料),使用count方法會超時!原因是,對於每個點的遍歷是o(n×m),然而在這個n×m個資料的一位陣列上利用count方法計數,則內層相當於又巢狀了o(n×m),所以時間效能十分低下。
如果採用「以空間換時間」的策略,開2^24的列表儲存顏色值的出現次數,雖然時間複雜度降低了,但是這樣會記憶體超限。
綜上所述,字典在兩者之間作出了平衡。
④充分理解「色差」:差值要加上絕對值再和tol作比較。
這道題我肝了好久,從**邏輯到效能優化,提交了不下二三十遍,在這個過程中非常感謝csdn上其他大佬的經驗分享。這段時間刷了好多pat乙級題,我不由得感嘆pat題還真的不能小覷,都很精品!一道程式設計題其實也考查了好多知識點,需要選擇合適的程式結構、資料結構,同時也要在時間複雜度和空間複雜度之間做出很好的權衡。歡迎各位大佬批評指正,不吝賜教~
Python基礎程式設計題
1 接收輸入的一行字元,統計出字串中包含數字的個數 str input 請輸入一串字元 count 0for i in str if i.isdigit count count 1print 數字個數 d count 2 請輸入星期幾的第一 個字母,用來判斷是星期幾,如果第乙個字母一樣,則繼續判斷第...
C 程式語言基礎19
reflection,中文翻譯為反射。這是.net中獲取執行時型別資訊的方式,net的應用程式由幾個部分 程式集 assembly 模組 module 型別 class 組成,而反射提供一種程式設計的方式,讓程式設計師可以在程式執行期獲得這幾個組成部分的相關資訊,例如 assembly類可以獲得正在...
測試面試 python基礎程式設計題
1.列表的去重 方法1 保持原列表的順序 l 1 2,2 4,8 7 l1 list set l 使用set 去重,無序 l2 sorted l1,key l.index 使用sorted的key關鍵字按列表l的索引值排序 或者使用list自帶的方法sort l1.sort key l.index ...