python自帶tkinter庫實(shí)現(xiàn)棋盤覆蓋圖形界面
python實(shí)現(xiàn)棋盤覆蓋圖形界面,供大家參考,具體內(nèi)容如下
一、解決方案和關(guān)鍵代碼
工具: python tkinter庫
問題描述:
在一個2^k×2^k個方格組成的棋盤中,若有一個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為一個特殊棋盤.顯然特殊方格在棋盤上出現(xiàn)的位置有4^k種情形.因而對任何k≥0,有4^k種不同的特殊棋盤。
在棋盤覆蓋問題中,要用下圖中 4 中不同形態(tài)的 L 型骨牌覆蓋一個給定的特殊棋牌上除特殊方格以外的所有方格,且任何 2 個 L 型骨牌不得重疊覆蓋。易知,在任何一個 2^k × 2^k 的棋盤中,用到的 L 型骨牌個數(shù)恰為 (4^k-1)/3 。

解決方法:遞歸與分治法
用分治策略,可以設(shè)計(jì)解棋盤問題的一個簡捷的算法。
當(dāng) k>0 時,將 2^k * 2^k 棋盤分割為 4 個 2^(k-1) * 2^(k-1) 子棋盤;
特殊方格必位于 4 個較小子棋盤之一中,其余 3 個子棋盤中無特殊方格。為了將這 3 個無特殊方格的子棋盤轉(zhuǎn)化為特殊棋盤,我們可以用一個 L 型骨牌覆蓋這 3 個較小的棋盤的匯合處,如下圖所示,這 3 個子棋盤上被 L 型骨牌覆蓋的方格就成為該棋盤上的特殊方格,從而將原問題化為 4 個較小規(guī)模的棋盤覆蓋問題。遞歸的使用這種分割,直至棋盤簡化為 1x1 棋盤。

算法關(guān)鍵代碼
def chessBoard(tr,tc,dr,dc,size): global tile global board if (size==1): return 0 tile+=1 t=tile s=size//2 #the upper left corner if (dr<tr+s and dc<tc+s): chessBoard(tr,tc,dr,dc,s) else: board[tr+s-1,tc+s-1]=t chessBoard(tr,tc,tr+s-1,tc+s-1,s) #the upper right corner if (dr<tr+s and dc>=tc+s): chessBoard(tr,tc+s,dr,dc,s) else: board[tr+s-1,tc+s]=t chessBoard(tr,tc+s,tr+s-1,tc+s,s) #the lower left corner if (dr>=tr+s and dc<tc+s): chessBoard(tr+s,tc,dr,dc,s) else: board[tr+s,tc+s-1]=t chessBoard(tr+s,tc,tr+s,tc+s-1,s) #the lower right corner if (dr>=tr+s and dc>=tc+s): chessBoard(tr+s,tc+s,dr,dc,s) else: board[tr+s,tc+s]=t chessBoard(tr+s,tc+s,tr+s,tc+s,s)
畫棋盤關(guān)鍵代碼:
def drawboard(canvas1,board,colors,startx=50,starty=50,cellwidth=50):
width=2*startx+len(board)*cellwidth
height=2*starty+len(board)*cellwidth
canvas1.config(width=width,height=height)#布置畫布
for i in range(len(board)):
for j in range(len(board)):
index=board[i][j]
if index== 0:
color='white'#特殊方格顯示為白色
else:
color=colors[6*index]#為了間隔開顏色
cellx=startx+i*50
celly=starty+j*50
canvas1.create_rectangle(cellx,celly,cellx+cellwidth,celly+cellwidth,fill=color,outline="black")#畫方格
canvas1.update()
二、數(shù)據(jù)測試
特殊方格坐標(biāo)為(1,1),棋盤大小為(2^2*2^2)

特殊方格坐標(biāo)為(2,2),棋盤大小為(2^3*2^3)

完整代碼下載鏈接點(diǎn)這里
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python中的支持向量機(jī)SVM的使用(附實(shí)例代碼)
這篇文章主要介紹了Python中的支持向量機(jī)SVM的使用(附實(shí)例代碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
tensorflow 實(shí)現(xiàn)自定義梯度反向傳播代碼
今天小編就為大家分享一篇tensorflow 實(shí)現(xiàn)自定義梯度反向傳播代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python利用標(biāo)簽實(shí)現(xiàn)清理微信好友的自動化腳本
微信已經(jīng)成為我們?nèi)粘I钪胁豢苫蛉钡纳缃还ぞ?隨著使用時間的增長,我們的微信好友列表可能會變得越來越臃腫,所以本文為大家準(zhǔn)備了通過標(biāo)簽清理微信好友的Python自動化腳本,希望對大家有所幫助2024-12-12
Python數(shù)據(jù)可視化之Pyecharts使用詳解
Pyecharts是一個由百度開源的、用于生成Echarts圖表的類庫,可以用來進(jìn)行數(shù)據(jù)可視化分析。本文將詳細(xì)講解一下Pyecharts的使用,需要的可以參考一下2022-04-04
python django集成cas驗(yàn)證系統(tǒng)
cas是什么東西就不多說了,簡而言之就是單點(diǎn)登陸系統(tǒng),一處登陸,全網(wǎng)有權(quán)限的系統(tǒng)均可以訪問2014-07-07
Pandas Series如何轉(zhuǎn)換為DataFrame
這篇文章主要介紹了Pandas Series如何轉(zhuǎn)換為DataFrame問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Python3之不使用第三方變量,實(shí)現(xiàn)交換兩個變量的值
今天小編就為大家分享一篇Python3之不使用第三方變量,實(shí)現(xiàn)交換兩個變量的值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

