用python代碼編寫象棋界面,棋盤覆蓋問題
阿新 • • 發佈:2018-12-07
n) end 所有 inf r+ glob rtl 分治 turtle
編寫象棋界面
import turtle t=turtle.Pen() t.speed(100) def angle(x,y): t.penup() t.goto(x+3,y+3) t.pendown() t.setheading(0) t.forward(5) t.goto(x+3,y+3) t.left(90) t.forward(5) t.penup() t.goto(x+3,y-3) t.pendown() t.setheading(0) t.forward(5) t.goto(x+3,y-3) t.left(90) t.forward(-5) t.penup() t.goto(x-3,y+3) t.pendown() t.setheading(0) t.forward(-5) t.goto(x-3,y+3) t.left(90) t.forward(5) t.penup() t.goto(x-3,y-3) t.pendown() t.setheading(0) t.forward(-5) t.goto(x-3,y-3) t.left(90) t.forward(-5) defv(x,y): t.penup() t.goto(x+3,y+3) t.pendown() t.setheading(0) t.forward(5) t.goto(x+3,y+3) t.left(90) t.forward(5) t.penup() t.goto(x+3,y-3) t.pendown() t.setheading(0) t.forward(5) t.goto(x+3,y-3) t.left(90) t.forward(-5) t.penup() defa(x,y): t.penup() t.goto(x-3,y+3) t.pendown() t.setheading(0) t.forward(-5) t.goto(x-3,y+3) t.left(90) t.forward(5) t.penup() t.goto(x-3,y-3) t.pendown() t.setheading(0) t.forward(-5) t.goto(x-3,y-3) t.left(90) t.forward(-5) #1.繪制所有橫線 t.penup() t.goto(-80,90) t.pendown() for i in range(1,6,1): t.forward(160) t.penup() t.right(90) t.forward(20) t.right(90) t.pendown() t.forward(160) t.penup() t.left(90) t.forward(20) t.left(90) t.pendown() #2.繪制所有豎線 t.left(90) t.penup() t.forward(20) t.pendown() for i in range(1,5,1): t.forward(80) t.penup() t.forward(20) t.pendown() t.forward(80) t.right(90) t.forward(20) t.right(90) t.forward(80) t.penup() t.forward(20) t.pendown() t.forward(80) t.left(90) t.forward(20) t.left(90) t.forward(180) t.left(90) t.forward(160) t.left(90) t.forward(180) #3.繪制斜線 t.left(90) t.forward(60) t.left(45) t.forward(40*1.414) t.left(45) t.forward(-40) t.left(45) t.forward(40*1.414) t.penup() t.goto(-20,90) t.pendown() t.right(180) t.forward(40*1.414) t.right(45) t.forward(-40) t.right(45) t.forward(40*1.414) #4.繪制炮和兵的位置 angle(60,50) angle(-60,50) angle(60,-50) angle(-60,-50) angle(40,30) angle(-40,30) angle(40,-30) angle(-40,-30) angle(0,30) angle(0,-30) a(80,30) a(80,-30) v(-80,-30) v(-80,30) #5.繪制外圍線 繪制一個長方形,設置筆的粗細 t.penup() t.goto(-90,-100) t.pendown() t.pensize(10) t.forward(200) t.right(90) t.forward(180) t.right(90) t.forward(200) t.right(90) t.forward(180) t.right(90)
棋盤覆蓋問題
在2^k*2^k個方格組成的棋盤中,有一個方格被占用,用下圖的4種L型骨牌覆蓋所有棋盤上的其余所有方格,不能重疊。
代碼如下:
def chess(tr,tc,pr,pc,size): global mark global table mark+=1 count=mark if size==1: return half=size//2 if pr<tr+half and pc<tc+half: chess(tr,tc,pr,pc,half) else: table[tr+half-1][tc+half-1]=count chess(tr,tc,tr+half-1,tc+half-1,half) if pr<tr+half and pc>=tc+half: chess(tr,tc+half,pr,pc,half) else: table[tr+half-1][tc+half]=count chess(tr,tc+half,tr+half-1,tc+half,half) if pr>=tr+half and pc<tc+half: chess(tr+half,tc,pr,pc,half) else: table[tr+half][tc+half-1]=count chess(tr+half,tc,tr+half,tc+half-1,half) if pr>=tr+half and pc>=tc+half: chess(tr+half,tc+half,pr,pc,half) else: table[tr+half][tc+half]=count chess(tr+half,tc+half,tr+half,tc+half,half) def show(table): n=len(table) for i in range(n): for j in range(n): print(table[i][j],end=‘ ‘) print(‘‘) mark=0 n=8 table=[[-1 for x in range(n)] for y in range(n)] chess(0,0,2,2,n) show(table)
n是棋盤寬度,必須是2^k,本例中n=8,特殊格子在(2,2)位置,如下圖所示:
采用分治法每次把棋盤分成4份,如果特殊格子在這個小棋盤中則繼續分成4份,如果不在這個小棋盤中就把該小棋盤中靠近中央的那個格子置位,表示L型骨牌的1/3占據此處,每一次遞歸都會遍歷查詢4個小棋盤,三個不含有特殊格子的棋盤置位的3個格子正好在大棋盤中央構成一個完整的L型骨牌,依次類推,找到全部覆蓋方法。運行結果如下:
用python代碼編寫象棋界面,棋盤覆蓋問題