Arzie100 发表于 2023-2-28 15:22

棋盘覆盖&动态界面

实验一、棋盘覆盖问题


输入
测试数据有若干行,每行3个整数k,x,y,其中n=2k是棋盘的规模,(x,y)是特殊方格的位置坐标,(k>1)。
输出
对输入中的每个正整数k,第一行上先输出“Case #: n=”,接着输出n的值,其中#是测试数据的序号,从1开始。第2到第n+1行,输出对于规模为n=2k的棋盘的一个覆盖。在该棋盘覆盖中,同一个骨牌用3个相同的数字表示。各骨牌表示的数字从1开始编号。特殊方格用#表示。
输入样例
1 2 1
2 2 3
输出样例
Case 1: n=2
1 #
1 1
Case 2: n=4
1 1 2 2
1 5 # 2
3 5 5 4
3 3 4 4


实验报告要求:
1.先分析要点、写出动态方程
2.提供正确运行的程序,可处理若干组数据,加上必要的注释及运行结果截图。
3.设计、调试中的问题及实验体会。
要求:可根据自己情况进行优化,验收时根据完成情况评分
1、第一层次(基本要求),用数字形式输出一个棋盘覆盖如输出样例的形式。
2、第二层次(进阶要求),用图形处理软件输出棋盘覆盖,用颜色将各骨牌进行区分。
C++代码如下:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int tile;
int board;

void chessBoard(int tr,int tc,int dr,int dc,int size){
    if(size==1)
      return;
    int t=tile++;
    int s=size/2;
    //检查特殊方块是否在左上角棋盘中
    if(dr<tr+s&&dc<tc+s)
      chessBoard(tr,tc,dr,dc,s);
    else
    {
      board=t;
      chessBoard(tr,tc,tr+s-1,tc+s-1,s);
    }
    //检查特殊方块是否在右上角棋盘中
    if(dr<tr+s&&dc>=tc+s)
      chessBoard(tr,tc+s,dr,dc,s);
    else
    {
      board=t;
      chessBoard(tr,tc+s,tr+s-1,tc+s,s);
    }
    //检查特殊方块是否在左下角棋盘中
    if(dr>=tr+s&&dc<tc+s)
      chessBoard(tr+s,tc,dr,dc,s);
    else
    {
      board=t;
      chessBoard(tr+s,tc,tr+s,tc+s-1,s);
    }
    //检查特殊方块是否在右下角棋盘中
    if(dr>=tr+s&&dc>=tc+s)
      chessBoard(tr+s,tc+s,dr,dc,s);
    else
    {
      board=t;
      chessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }
}

int main()
{
    int k,n=0;
    //cout<<"输入k(棋盘的size为2的k次幂): ";

    int index_x,index_y;
    //cout<<"输入特殊方格位置的坐标: ";
    while(cin>>k>>index_x>>index_y)
    {
      n++;
      tile=1;
      int size=int(pow(2,k));
      chessBoard(0,0,index_x-1,index_y-1,size);
      cout<<"Case "<<n<<": \n"<<"n="<<size<<endl;

      for(int i=0;i<size;i++)
      {
            for(int j=0;j<size;j++)
                cout<<setw(4)<<board;
            cout<<endl;
      }
    }
    //cin>>index_x>>index_y;

    return 0;
}
运行结果:



python 代码如下以及动态界面:
from tkinter import *
import threading
from time import sleep

mark=0
board=[[]]
def run1():

   a = int(inp1.get())
   b = int(inp2.get())
   c = int(inp3.get())
   print("size: ",a)
   print((b,c))
   inp1.delete(0, END)# 清空输入
   inp2.delete(0, END)# 清空输入
   inp3.delete(0, END)# 清空输入
   tile=1
   global board
   global mark
   mark=0
   board=[*a for i in range(a)]
   chess(0,0,b,c,a)
   
   colors=['white','#36ddd9','#668B8B','#7FFFD4','#66CDAA','#458B74','#C1FFC1','#9BCD9B','#00FF00','#008B45','#6495ED','#483D8B',
   'orange','yellow','green','cyan','blue','pink','purple','red','#6A5ACD','#8470FF','#0000CD','#1E90FF','#00BFFF','#87CEFA','#00CED1']
   startx=200
   starty=200
   cellwidth=50
   root=Tk()
   canvas=Canvas(root,bg="white")
   canvas.pack()
   width=2*startx+len(board)*cellwidth
   height=2*starty+len(board)*cellwidth
   canvas.config(width=width,height=height)

   t=threading.Thread(target=drawboard,args=(board,colors,canvas))
   t.start()
   #drawboard(board,colors)
   root.mainloop()
   

def chess(tr,tc,pr,pc,size):
    global mark
    global board
    if size==1:
      return
    mark+=1
    count=mark
    half=size//2
    if pr<tr+half and pr>=tr and pc<tc+half and pc>=tc:
      chess(tr,tc,pr,pc,half)
    else:
      board=count
      chess(tr,tc,tr+half-1,tc+half-1,half)
    if pr<tr+half and pr>=tr and pc>=tc+half and pc<tc+size:
      chess(tr,tc+half,pr,pc,half)
    else:
      board=count
      chess(tr,tc+half,tr+half-1,tc+half,half)
    if pr>=tr+half and pr<tr+size and pc<tc+half and pc>=tc:
      chess(tr+half,tc,pr,pc,half)
    else:
      board=count
      chess(tr+half,tc,tr+half,tc+half-1,half)
    if pr>=tr+half and pr<tr+size and pc>=tc+half and pc<tc+size:
      chess(tr+half,tc+half,pr,pc,half)
    else:
      board=count
      chess(tr+half,tc+half,tr+half,tc+half,half)


def drawboard(board,colors,canvas,startx=200,starty=200,cellwidth=50):
    for i in range(len(board)):
      for j in range(len(board)):
            index=board
            if index!=-1:
                color=colors
                cellx=startx+i*50
                celly=starty+j*50
                canvas.create_rectangle(cellx,celly,cellx+cellwidth,celly+cellwidth,
                  fill=color,outline="black")
                board=-1
                for t1 in :
                  for t2 in :
                        if board==index:
                            cellx=startx+t1*50
                            celly=starty+t2*50
                            canvas.create_rectangle(cellx,celly,cellx+cellwidth,celly+cellwidth,
                  fill=color,outline="black")
                canvas.update()
               
                sleep(0.5)
               
            
   
   
    # root.mainloop()

if __name__ == "__main__":
    root = Tk()
    root.geometry('460x240')
    root.title('棋盘器')

    lb1 = Label(root, text='请分别输入棋盘的size和特殊棋子的x,y位置')
    lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
    inp1 = Entry(root)
    inp1.place(relx=0.35, rely=0.2, relwidth=0.3, relheight=0.1)
    inp2 = Entry(root)
    inp2.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
    inp3 = Entry(root)
    inp3.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)


    # 方法-直接调用 run1()
    btn1 = Button(root, text='运行', command=run1)
    btn1.place(relx=0.35, rely=0.6, relwidth=0.3, relheight=0.1)

    root.mainloop()

运行结果动态截图1,2,3,4:









Doris232 发表于 2023-2-28 15:27

棋盘覆盖问题属于什么难度的问题?

RhinoFreak 发表于 2023-2-28 15:36

中等

Ylisar 发表于 2023-2-28 15:42

您好,请问那个棋盘用python写的输入特殊棋子的位置为什么不是第三行第2列呀?

kyuskoj 发表于 2023-2-28 15:51

第一格是0,0开始的

TheLudGamer 发表于 2023-2-28 15:59

M×N棋盘 用两块骨牌填充 有多少种方法 怎么用算法编写呢[思考][思考]
页: [1]
查看完整版本: 棋盘覆盖&动态界面