2024年5月9日 星期四

【ZEROJUDGE】b548. 4.賓果遊戲

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