棋盤覆蓋問題可視化動圖——python


棋盤覆蓋問題可視化動圖——python

棋盤覆蓋問題是一個經典的分治法解決的問題,具體內容可以參照以下博主的解析

棋盤覆蓋算法解析

為了更好的理解該算法分治的過程

利用了python中的matplotlib庫進行了該算法的可視化

avatar

具體動畫可復制代碼在本地運行查看

import matplotlib.pyplot as plt 
import numpy as np 

count=0
color=['yellow','green','blue','red','purple'] #顏色數組


def fill(x,y,t):

    xx=np.linspace(x,x+1,10)
    yy=np.linspace(y,y,10)
    yy1=np.linspace(y+1,y+1,10)
    plt.fill_between(xx,yy,yy1,facecolor=color[t%(len(color))]) #填充
    plt.text(x+0.5,y+0.5,t) #添加文字
    plt.pause(1) #動態畫圖 參數為變化的時間
    pass 


def ChessBoard(tr,tc,dr,dc,size):
    if size==1:  #算法實現
        return 
    global count
    global Board 
    count+=1
    t=count
    s=size//2
    if dr<tr+s and dc<tc+s:
        ChessBoard(tr,tc,dr,dc,s)
    else:
        Board[tr+s-1][tc+s-1]=t
        fill(tr+s-1,tc+s-1,t)
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s)
    
    if dr<tr+s and dc>=tc+s:
        ChessBoard(tr,tc+s,dr,dc,s)
    else:
        Board[tr+s-1][tc+s]=t
        fill(tr+s-1,tc+s,t)
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s)

    if dr>=tr+s and dc<tc+s:
        ChessBoard(tr+s,tc,dr,dc,s)
    else:
        Board[tr+s][tc+s-1]=t
        fill(tr+s,tc+s-1,t)
        ChessBoard(tr+s,tc,tr+s,tc+s-1,s)

    if dr>=tr+s and dc>=tc+s:
        ChessBoard(tr+s,tc+s,dr,dc,s)
    else:
        Board[tr+s][tc+s]=t
        fill(tr+s,tc+s,t)
        ChessBoard(tr+s,tc+s,tr+s,tc+s,s)

def pre():
    x=2**n
    y=2**n
    xx=np.linspace(x,x+1,10)
    yy=np.linspace(y,y,10)
    yy1=np.linspace(y+1,y+1,10)
    plt.fill_between(xx,yy,yy1,facecolor='white') 
    plt.pause(1)
    pass 

n=int(input())
Board=[[0 for i in range(2**n)] for j in range(2**n)]
x,y=map(int,input().split())
pre() #圖像預處理
Board[x][y]=-1
ChessBoard(0,0,x,y,2**n)
for i in range(2**n):
    for j in range(2**n):
        print(Board[i][j],end=' ')
    print()

plt.show()
# n為正方形的階數 x y為方格點的坐標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM