【ZEROJUDGE】b548. 4.賓果遊戲
https://zerojudge.tw/ShowProblem?problemid=b548
解題思路-Python-給我自己
1。二維陣列放原始賓果資料。
d=[ ]
for i 迴圈跑五次(0~4)
d.append([ ])
d[i]的值一次讀一行。
2。標記被畫記的數值。
dd=d #dd放被畫記的數值
while不是-1時
跑雙層迴圈,將輸入的值在dd相對應的位置標記0
表示被畫記。
3。用一維陣列創26個位置,初始給0(表示分數用)
s=[0]*26
用雙層for一個一個跑dd,如果不是0,跑副程式判斷分數
最後將一維分數s的最大值印出(剛好若有重覆者,印小數值)
------------------------------------------
副程式(接收傳來的數字和i和j的座標)(二維陣列的索引值)
將主程式送來的非0數字位置改為0之後開始判斷
(若選號之後可能的分數)
有四種情況
判斷直欄都為0(得分1)
判斷橫列都為0(得分1)
判斷右上左下斜線(i+j==4)都為0(得分1)
判斷左上右下斜線(i==j)都為0(得分1)
(要記得把值改回非0)(我就是錯在這邊,錯誤找很久)
回傳得分
------------------------------------------
程式碼:
#放二維資料值
#註記叫號記錄
#副程式判斷得分
#計算賓果得分1~25的一維list,用max值找index就可以了。(剛好是小的值)
#副程式判斷得分
#四個判斷(橫列r,直欄c,右上左下r,及左上右下l)
#加上非0的數字後,判斷所得的分,放入一維陣列中
def f(n,i,j):
global dd
ddd=dd
ddd[i][j]=0
score=0
#判斷直欄c
allz=True
for x in range(5):
if ddd[x][j]!=0:
allz=False
break
if allz==True:
score=score+1
#判斷橫列r
allz=True
for x in range(5):
if ddd[i][x]!=0:
allz=False
break
if allz==True:
score=score+1
#判斷右上左下r
if i+j==4:
if ddd[0][4]==0 and
ddd[1][3]==0 and ddd[2][2]==0 and ddd[3][1]==0 and ddd[4][0]==0:
score=score+1
#判斷左上右下l
allz=True
if i==j:
for x in range(5):
if
ddd[x][x]!=0:
allz=False
break
if allz==True:
score=score+1
ddd[i][j]=n
return(score)
#用二維陣列放值
d=[]
for i in range(5):
d.append([])
d[i]=list(map(int,input().split()))
#依輸入值替換分數
dd=d #dd放被畫記的賓果
n=int(input())
while n != -1:
for i in range(5):
for j in range(5):
if
n==dd[i][j]:
dd[i][j]=0 #值0表示被畫記
n=int(input())
#用一維陣列判斷誰得分高(用副程式跑分數)
s=[0]*26 #創一個26個註標的list,初始皆0
for i in range(5):
for j in range(5):
if dd[i][j] != 0:
ind=dd[i][j]
s[ind]=f(dd[i][j],i,j) #跑副程式,回傳分數放一維陣列
print(s.index(max(s))) #印結果
------------------------還要考慮,都分皆為0的情況(謝謝賴楷宗老師的提醒指導)-------------------
可以把最後一行的程式碼,再考慮一下
#移除已標記0的數值,這樣dd[0]就是還沒被畫到的最小值
dd=sum(dd,[])
dd.sort()
while dd[0] == 0:
dd.pop(0)
at=s.index(max(s))
if at==0: #當所有結果都是0的狀態時
print(dd[0])
else:
print(at)