C# 可視化——棋盤覆蓋演示程序

問題重述:在一個2k×2k 個方格組成的棋盤中,恰有一個方格與其它方格不同,稱該方格爲一特殊方格,稱該棋盤爲一特殊棋盤。

棋盤覆蓋:用4種不同形態的L型骨牌, 覆蓋給定特殊棋盤上除特殊方格以外的所有方格,且任何2個不得重疊。按照規則,我們很容易知道,在2^k*2^k的棋盤覆蓋中,用到的L型骨盤數恰爲(4^k-1)/3,即(所有方格個數-特殊方格個數)/3。

           k=2時的一種棋盤                            4種不同形態的L型骨牌

分析思路:當k>0時,將2^k*2^k棋盤分割爲4個2^k-1*2^k-1子棋盤,如圖

 

特殊方格必定位於這四個小棋盤中,其餘三個子棋盤沒有特殊方格,爲了將這三個無特殊方格的子棋盤轉換爲特殊棋盤,我們可以用一個L型骨盤覆蓋這三個較小棋盤的會合處,如圖所示:

 

從圖上可以看出,這三個子棋盤上被L型骨牌覆蓋的方格就成爲該棋盤上的特殊方格,從而將問題分解爲4個較小規模的棋盤覆蓋問題。遞歸地使用這種分割方法,直至棋盤簡化爲1*1棋盤,就結束遞歸。

 

用C#中的Graphics類用於繪製棋盤,用筆刷填充棋盤上的方塊模擬棋盤覆蓋。不同的L型方塊用不同顏色的筆刷填充。

程序初始化時繪製一個默認8*8大小的棋盤,將默認左上角位置的特殊方格填充顏色,程序面板右側的參數設置此時也是相應的默認值。

      自定義棋盤大小爲16,特殊方格座標爲(4,1)。

       設置棋盤大小時,若通過控件的上下箭頭來調整棋盤大小,該數值只能是2的冪次方。如果直接從鍵盤輸入一個數,若這個數不是2的冪次方,則有相應的消息框提示。

    設置特殊方塊座標時也有相應限制。輸入的座標只能在棋盤大小之內,若輸入不合理的座標,有相應的消息框提示。

      按下開始按鈕之後,開始動畫演示棋盤覆蓋過程,同時開始按鈕變爲暫停按鈕,點擊可以暫停。通過上一步下一步按鈕回放或快進每一幀,按下結果鍵直接顯示棋盤覆蓋結果,按下重置鍵恢復到初始狀態。

源碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章