1. 程式人生 > >用python代碼編寫象棋界面,棋盤覆蓋問題

用python代碼編寫象棋界面,棋盤覆蓋問題

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) def
v(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() def
a(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代碼編寫象棋界面,棋盤覆蓋問題