Python程式設計基礎題(19 萬綠叢中一點紅)

2021-10-11 09:19:16 字數 3945 閱讀 2810

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 ...