棋盘覆盖&动态界面
实验一、棋盘覆盖问题输入
测试数据有若干行,每行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<<&#34;输入k(棋盘的size为2的k次幂): &#34;;
int index_x,index_y;
//cout<<&#34;输入特殊方格位置的坐标: &#34;;
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<<&#34;Case &#34;<<n<<&#34;: \n&#34;<<&#34;n=&#34;<<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(&#34;size: &#34;,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=[&#39;white&#39;,&#39;#36ddd9&#39;,&#39;#668B8B&#39;,&#39;#7FFFD4&#39;,&#39;#66CDAA&#39;,&#39;#458B74&#39;,&#39;#C1FFC1&#39;,&#39;#9BCD9B&#39;,&#39;#00FF00&#39;,&#39;#008B45&#39;,&#39;#6495ED&#39;,&#39;#483D8B&#39;,
&#39;orange&#39;,&#39;yellow&#39;,&#39;green&#39;,&#39;cyan&#39;,&#39;blue&#39;,&#39;pink&#39;,&#39;purple&#39;,&#39;red&#39;,&#39;#6A5ACD&#39;,&#39;#8470FF&#39;,&#39;#0000CD&#39;,&#39;#1E90FF&#39;,&#39;#00BFFF&#39;,&#39;#87CEFA&#39;,&#39;#00CED1&#39;]
startx=200
starty=200
cellwidth=50
root=Tk()
canvas=Canvas(root,bg=&#34;white&#34;)
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=&#34;black&#34;)
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=&#34;black&#34;)
canvas.update()
sleep(0.5)
# root.mainloop()
if __name__ == &#34;__main__&#34;:
root = Tk()
root.geometry(&#39;460x240&#39;)
root.title(&#39;棋盘器&#39;)
lb1 = Label(root, text=&#39;请分别输入棋盘的size和特殊棋子的x,y位置&#39;)
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=&#39;运行&#39;, command=run1)
btn1.place(relx=0.35, rely=0.6, relwidth=0.3, relheight=0.1)
root.mainloop()
运行结果动态截图1,2,3,4:
棋盘覆盖问题属于什么难度的问题? 中等 您好,请问那个棋盘用python写的输入特殊棋子的位置为什么不是第三行第2列呀? 第一格是0,0开始的 M×N棋盘 用两块骨牌填充 有多少种方法 怎么用算法编写呢[思考][思考]
页:
[1]