京東筆試程式設計題之消消樂

2021-09-27 06:22:40 字數 2510 閱讀 6732

題目:有乙個5*5的正方形網格,沒個格仔中有乙個大於0且小於4的整數,對於乙個確定的局面,若乙個格仔與它上下左右四個方向的某個格仔(如果存在)數字相同,則稱這兩個格仔是連通的,並且這種連通具有傳遞性。

每次,可以選擇乙個格仔,若與這個格仔連通的格仔(包括自己)數大於等於3,你就可以選擇消掉這個格仔,與此同時,與這個格仔連通的所有格仔會一起消失。

如果僅僅是這樣,那就太簡單了,因為無論如何消除,最後的結果都是一樣的,所以我們引入重力系統,每次選擇消掉某個格仔,並將與那個格仔相連通的所有格仔都消掉後將會有一些格仔失去支撐,此時那些格仔就會因重力而下落。

實現**如下:

#廣度優先搜尋,佇列實現

def findsame(arr, book, i, j, queue, front, rear, count):

#保證當前點不為0

if arr[i][j] == 0:

return

#當前節點入隊

rear[0] = rear[0] + 1

#佇列不為空時

while(front[0] != rear[0]):

#先出隊

i, j = queue[front[0]]

front[0] = front[0] + 1

#標記當前正在訪問的點

book[i][j] = 1

#相同的點數量增加

count[0] = count[0] + 1

#上右下左查詢與當前位置相同的項,注意,順序必須是上右下左

if (i-1 >= 0) and (arr[i][j] == arr[i-1][j]) and (book[i-1][j] == 0):

#如果(i,j)點上方存在點,並且該點值等於當前點的值,而且改點沒有被訪問過,該點入隊

rear[0] = rear[0] + 1

if (j+1 <= 4) and (arr[i][j] == arr[i][j+1]) and (book[i][j+1] == 0):

rear[0] = rear[0] + 1

if (i+1 <= 4) and (arr[i][j] == arr[i+1][j]) and (book[i+1][j] == 0):

rear[0] = rear[0] + 1

if (j-1 >= 0) and (arr[i][j] == arr[i][j-1]) and (book[i][j-1] == 0):

rear[0] = rear[0] + 1

def initbook(book):

for i in range(5):

for j in range(5):

book[i][j] = 0

def fall(arr, book):

#根據book記錄的值,把arr裡的值改為0,然後下降

for i in range(5):

for j in range(5):

if book[i][j] == 1:

arr[i][j] = 0

for j in range(0, 5):

#對每一列

for i in range(4, 0, -1): #從4到1, 檢查有沒有為0的(有沒有下降的)

#每一行

time = 0 #計算下移次數

#只要當前點為0,就一直下移。當下移次數time等於行數時,break跳出迴圈,不然就會無限迴圈,因為arr[i][j]有可能一直為0

while(arr[i][j] == 0):

if time == 5:

break

#把j列0,...,i-1個元素下移

for k in range(i-1, -1, -1):

arr[k+1][j] = arr[k][j]

arr[0][j] = 0 #每下移一次,都要把最上面的元素換成0

time = time + 1

arr =

book =

for _ in range(5):

data = input().split(' ') #按行輸入

#初始化book陣列

booktemp =

for _ in range(5):

queue =

front = [0]

rear = [0]

for i in range(5):

for j in range(5):

initbook(book) #每次都初始化book

count = [0]

findsame(arr, book, i, j, queue, front, rear, count)

if count[0] >= 3:

fall(arr, book) #每消一次就下降

print(arr)

#print(book)

print()

京東筆試程式設計題。。消消樂

題目是 輸入5 5的矩陣,數值大小為1 5,上下左右相同的數值達到3個或以上可消除,每次都消除可消除的最大的那個區域,消除後的剩餘數值?由重力作用向下移動,求按此規則消除,直到無法消除時,剩餘未消除數值的個數。例如 31211 第一次 xx xx xx 3x2xx 3x223 第二次 xx xx x...

京東筆試程式設計題之方塊消除

5x5矩陣三三消除 無重力解決方案 input 4 52 2 3 1 2 3 1 1 1 1 2 3 2 1 3 2 2 3 3 3 output 2 2 3 0 2 3 0 0 0 0 2 3 2 0 3 2 2 0 0 0 n,m int x for x in input split 將n,m ...

京東2015校招筆試程式設計題

醜數問題,在 劍指offer 一書的182頁有詳細討論。簡單來說,就是 新的醜數總是以前的某個醜數乘以2 3或5產生,那麼分別用三個指標p2 p3和p5指向乘以2 3和5後能生成新的醜數的醜數,那麼下乙個醜數就是它們生成的新的醜數中最小的乙個。public static int kthnumber ...