八皇后问题实验报告
数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河

数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河实验报告:数据结构与算法专题实验报告实验题目:八皇后问题的求解与背包问题的求解实验目的:1. 掌握八皇后问题的求解方法,了解回溯算法的应用。
2. 掌握背包问题的求解方法,了解动态规划算法的应用。
3. 进一步理解数据结构与算法的基本概念和应用。
实验内容:1. 八皇后问题的求解八皇后问题是一个经典的递归与回溯算法问题,要求在一个8×8的棋盘上放置8个皇后,使得任意两个皇后不在同一行、同一列或同一斜线上。
具体求解步骤如下:a. 定义一个8×8的二维数组作为棋盘,初始化所有元素为0。
b. 从第一行开始,依次尝试在每一列放置皇后。
c. 对于每一列,判断当前位置是否与已经放置的皇后冲突。
如果冲突,则回溯到上一行,重新选择位置;否则,继续放置下一行的皇后。
d. 当放置完所有皇后时,输出结果。
2. 背包问题的求解背包问题是一个经典的动态规划算法问题,要求在给定的一组物品中选择一些物品放入背包,使得背包的总重量最大,但不能超过背包的承重量。
具体求解步骤如下:a. 定义一个二维数组dp,其中dp[i][j]表示在前i个物品中选择,背包容量为j时的最大重量。
b. 初始化dp数组的第一行和第一列为0,表示背包容量为0时和没有物品可选时的最大重量都为0。
c. 对于每个物品,分两种情况讨论:- 如果当前物品的重量大于背包的容量,则无法选择该物品,直接继承前i-1个物品的最大重量,即dp[i][j] = dp[i-1][j];- 如果当前物品的重量小于等于背包的容量,则可以选择该物品或不选择该物品。
选择该物品时,背包的总重量为dp[i-1][j-w[i]] + v[i],不选择该物品时,背包的总重量为dp[i-1][j]。
取两者中的较大值作为dp[i][j]的值。
d. 最终,dp[n][m]即为所求的最大重量,其中n为物品的个数,m为背包的承重量。
八皇后实验报告

八皇后实验报告八皇后实验报告引言:八皇后问题是一个经典的数学问题,它要求在一个8x8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击。
这个问题看似简单,但实际上却充满了挑战。
在本次实验中,我们将探索八皇后问题的解法,并通过编写算法来解决这个问题。
一、问题背景:八皇后问题最早由数学家马克斯·贝瑟尔于1848年提出,它是一道经典的递归问题。
在国际象棋中,皇后可以在同一行、同一列或同一对角线上进行攻击,因此我们需要找到一种方法,使得8个皇后彼此之间不会相互攻击。
二、解决方法:为了解决八皇后问题,我们可以使用回溯法。
回溯法是一种穷举搜索的方法,它通过逐步尝试所有可能的解决方案,直到找到符合要求的解。
具体步骤如下:1. 初始化一个8x8的棋盘,并将所有格子标记为无皇后。
2. 从第一行开始,依次尝试在每一列放置一个皇后。
3. 在每一列中,检查当前位置是否符合要求,即与已放置的皇后不在同一行、同一列或同一对角线上。
4. 如果当前位置符合要求,将皇后放置在该位置,并进入下一行。
5. 如果当前位置不符合要求,尝试在下一列放置皇后。
6. 重复步骤3-5,直到找到一个解或者所有可能的位置都已尝试过。
7. 如果找到一个解,将其输出;否则,回溯到上一行,继续尝试下一列的位置。
三、编写算法:基于上述步骤,我们可以编写一个递归函数来解决八皇后问题。
伪代码如下所示:```function solveQueens(board, row):if row == 8:print(board) # 打印解returnfor col in range(8):if isSafe(board, row, col):board[row][col] = 1solveQueens(board, row + 1)board[row][col] = 0function isSafe(board, row, col):for i in range(row):if board[i][col] == 1:return Falseif col - (row - i) >= 0 and board[i][col - (row - i)] == 1:return Falseif col + (row - i) < 8 and board[i][col + (row - i)] == 1:return Falsereturn Trueboard = [[0]*8 for _ in range(8)]solveQueens(board, 0)```四、实验结果:通过运行上述算法,我们得到了八皇后问题的所有解。
算法设计与分析实验报告—八皇后问题

算法设计与分析实验报告—八皇后问题-姓名:***学号:********班级:软件83【问题描述】在国际象棋盘上放八个皇后,要求任一皇后吃不到别人,也不受其他皇后的攻击,求出问题的所有解。
【问题分析&算法设计】用8元组x[1: n]表示8后问题。
其中x[ i]表示皇后i放在棋盘的第i行的第x[ i]列。
由于不允许将2个皇后放在一列,所以解向量中的x[ i]互不相同。
2个皇后不能放在同一斜线上是问题的隐约束。
故若2个皇后放置的位置分别是(i,j)和(k,l),且i – j = k – l或i + j = k + l,则说明这2个皇后处于同一斜线上。
这两个方程分别等价于i – k = j – l和i – k = l – j。
由此可知,只要|i - k| = |j - l|成立,就表明2个皇后位于同一条斜线上。
问题的隐约束化成了显约束。
用回溯法解决8皇后问题时,用完全8叉树表示解空间。
【算法实现】#include "stdio.h"#include "math.h"#include "iostream.h"#define N 8 /* 定义棋盘大小*/static int sum; /* 当前已找到解的个数*/static int x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列*//* 每找到一个解,打印当前棋盘状态*/void Show(){sum++;cout << "第" << sum << "种情况:" << endl;cout << "坐标为:\t";for(int k = 0; k < N; k++)cout << '(' << k+1 << ',' << x[k] << ") ";cout << endl;cout << "---------------------------------\n";for (int i = 0; i < N; i ++){for (int j = 0; j < N; j ++)if (j == x[i]) //printf("@ ");cout << "* | ";else //printf("* ");cout << " | ";cout << "\n---------------------------------\n";}}/* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */int Judge(int k){// 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。
数据结构 八皇后问题 报告

数据结构实验报告实验名称:实验2 利用栈结构实现八皇后问题学生姓名:廖宁班级:2009211114班内序号:18学号:09210411日期:2010年11月18日1.实验要求八皇后问题是19世纪著名的数学家高斯于1850年提出的。
他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。
请设计算法打印所有可能的摆放方法。
提示:(1)可以使用递归或非递归两种方法实现。
(2)实现一个关键算法,判断任意两个皇后是否在同一行、同一列和同一斜线上。
2. 程序分析程序工程包含一个模板类函数实现定义的源文件forthelove.cpp和测试源文件sbsuowang.cpp。
2.1 存储结构存储结构为栈。
2.2 关键算法分析(1)判断在第row行第column列摆放皇后是否非法,采取定行不定列的方法,列相等的算法为position[i]=colume,对角线相等有两种情况:一是position在上则row-i=colume-position[i];二是position在下,row-i=position[i]-colume.加入能放皇后,列和对角线上值都不能相等。
具体代码如下:int IsIllegal(int row, int column, const int* position){/int i;for (i=1; i < row; ++i){if ((position[i] == column)|| (row - i == column - position[i])|| (row - i == position[i] - column)){return TRUE;}}return FALSE;}(2)我采用定行尝试列的方法来遍历,记录皇后位置的数组可以和栈数组合二为一,而栈顶指针也可以和行坐标合二为一,这样一来栈帧只要一个列坐标就可以了。
1.伪代码:while(栈不空){if ( 行(即栈顶) <= n && 列<= n ){if ( 当前位置不能放皇后){列++;}else{列入栈(隐含着"行++");列= 1;}}else{if ( 行(即栈顶) > n ){输出位置数组(即栈数组);}列退栈(隐含着"行--");列++;}}//end while具体实现代码:void Queens(int n, void (* Visit)(const int* position)) {//position[n]数组:position[0]为棋盘大小,即n//position[1]~position[n]:下标为行坐标,值为列坐标int* stack = NULL; //栈int top; //栈顶int column; //列stack = (int*)malloc((n + 1) * sizeof(int));stack[0] = n;top = column = 1;while(top > 0){if ((top <= n) && (column <= n)){if (IsIllegal(top, column, stack)){++column;}else{stack[top++] = column;column = 1;}}else{if (top > n){(* Visit)(stack);}column = stack[--top];++column;}}//end whilefree(stack);return;}3. 程序运行结果程序实现八皇后问题:经过测试,程序运行良好,无明显错误。
国际象棋中的八皇后问题解决实验报告

八皇后一、作业题目:在国际象棋的棋盘上摆上八个皇后,使得任何两个皇后不在一行,不在一列,同时也不在一条斜线上。
要求找出所有的解。
二、作业目的:(1)训练C语言编程能力和数据结构中一些方法的运用。
(2)体会数据结构中的方法对简化编程的好处。
三、作业要求:在国际象棋的棋盘上摆上八个皇后,使得任何两个皇后不在一行,不在一列,同时也不在一条斜线上。
要求找出所有可行的方法,并输出所有方法的数目和每种方法如何排列。
四、算法思想:先将所有的点全部置为有可能有皇后,选择第一行的一个点为起点后,进行修剪,当某个点所在的行列斜边都有可能皇后时,则该点有皇后,同时将该点所在的直线斜线上除此点外的所有点都标记为不可能有皇后。
用递归法遍历下面的行。
即前面行的皇后确定后看后面行所有的可能情况。
当递归依次跳出,跳到第一次调用的的子函数时,则该起点对应的方法都找完了。
找出该起点所对应的所有方法后,起点在第一行向后移,再递归遍历。
当遍历完同一行八个起点后,就可以得出所有方法。
用一个子函数输出结果,其中有皇后的地方用“Q”表示,没有的用“.”表示。
五、数据结构:用数组存储六、程序:#include <stdio.h>#include <stdlib.h>#define N 8int column[N+1]; // 同栏是否有皇后,1表示有int rup[2*N+1]; // 右上至左下是否有皇后int lup[2*N+1]; // 左上至右下是否有皇后int queen[N+1] = {0};int num; // 解答编号void backtrack(int i); // 递归求解int main(void) {int i;num = 0;for(i = 1; i <= N; i++)column[i] = 1;for(i = 1; i <= 2*N; i++)rup[i] = lup[i] = 1;backtrack(1);return 0;}void showAnswer() {int x, y;printf("\n解答%d\n", ++num);for(y = 1; y <= N; y++) {for(x = 1; x <= N; x++) {if(queen[y] == x) {printf(" Q");}else {printf(" .");}}printf("\n");}}void backtrack(int i) {int j;if(i > N) {showAnswer();}else {for(j = 1; j <= N; j++) {if(column[j] == 1 &&rup[i+j] == 1 && lup[i-j+N] == 1) { queen[i] = j;// 设定为占用column[j] = rup[i+j] = lup[i-j+N] = 0;backtrack(i+1);column[j] = rup[i+j] = lup[i-j+N] = 1;}}}}七、运行结果:八、操作界面:九、结论:一共有92种遍历方法十、参考文献:[1]廖明宏郭福顺张岩李秀坤.数据结构与算法(第四版),高等教育出版社,2007.[2]苏小红陈惠鹏孙志刚.C语言大学实用教程(第二版),电子工业出版社,2010.。
人工智能实验报告(八皇后)

a[m]=i; sesearch(m+1,a); a[m]=100; } } } } int main() {
int a[8],i; fp=NULL; fp=fopen("output.txt","w+"); if(NULL==fp) {
printf("cann't open the file\n"); } for(i=0;i<8;++i)
if((a[j]+j)==(m+i)||//判断是否会有冲突 ((a[j]-j)==(i-m))|| (a[j]==i)) return 0;
++j; } return 1; } void output(int a[8]) { int i=0,j; fprintf(fp,"No %d:\n",n);
《人工智能导论》上机实验
八皇后问题求解
班级:10011207 姓名:盛家铭 学号:2012302532
图搜索策略实验 八皇后问题求解 一、实验软件
codeblocks 环境
二、 实验目的
通过实验能对搜索策略有更深刻的理解 熟悉人工智能系统中的问题求解过程; 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 熟悉对八数码问题的建模、求解及编程语言的应用。 三、 需要的知识 熟悉人工智能系统中的问题求解过程; 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 熟悉对八数码问题的建模、求解及编程语言的应用。 四、 实验数据及步骤 1、实验内容 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8 ×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法 直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于 同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的 n 皇后摆放问题:这时棋盘的大小变为 n×n,而皇后个数也变成 n。 当且仅当 n = 1 或 n ≥ 4 时问题有解。 2、程序函数调用图
北邮信通院数据结构实验二--八皇后问题实验报告(内附源代码完整版)

2.1存储结构
存储结构:栈(递归)
2.2关键算法分析
递归调用摆放皇后
1、关键算法伪代码:
(1).如果输入的row大于皇后的数量,则输出皇后的位置
(2)否则col从0开始递增
(3)检测(row,col)上的点是否符合条件,不符合则col自增,符合则转到下一个皇后的排列
2、代码详细分析:
void SeqStack::PlaceQueen(int row) //摆放皇后
{
for (int col=0;col< n;col++) //遍历0~7,
{
Push(col);
if (Check()) //判断摆放皇后的位置是否合适
{
if (row< n-1) //若还没有放到最后一个,则进行下一个皇后的放置
PlaceQueen(row+1);
else
{
num++; //计数器加1
{
if(top>= m-1) throw "上溢";
top++; //栈顶指针上移
data[top]=x;
}
void SeqStack::Pop() //出栈操作
{
if(Empty()) throw "下溢";
top--; //栈顶指针下移
}
void SeqStack::PlaceQue计放置八皇后,只要修改输入的N,便可显示其他情况的结果。
Print(n); //打印成功的坐标点
}
}
Pop(); //若不符合条件则出栈
}
}
bool SeqStack::Empty()
八皇后问题实验报告

实验报告——八皇后问题求解(递归和非递归)学号:专业年级:姓名:一、需求分析(要实现的功能描述)1.问题描述八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。
当且仅当n=1或n≥4时问题有解。
八皇后问题最早是由国际国际象棋棋手马克斯·贝瑟尔于1848年提出。
诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。
2.实现功能八皇后问题实现了在棋盘上摆放八个皇后的功能,这八个皇后任意两个皇后都不能处于同一条横行、纵行或斜线上。
3.测试数据测试数据可以通过手工寻找三组满足需要的值,测试数组(M,N),其中M代表皇后所在的行,N代表皇后所在的列。
例如,第一组测试数据:(1,4)、(2,7)、(3,3)、(4、8)、(5,2)、(6,5)、(7,1)、(8,6);第二组测试数据(1,4)、(2,2)、(3,7)、(4,3)、(5,6)、(6,8)、(7,5)、(8,1)。
最后与编程求得的结果进行比较。
如果这三组数据在最后编程求得的结果中,说明程序的编写基本没有什么问题。
二、概要设计在进行概要设计的过程中,要清楚整个程序包含的功能模块及模块间的调用关系。
对于八皇后问题,整个程序中应该包括主函数模块,摆放皇后的函数模块,以及判断皇后的位置是否摆放正确的判断模块。
对于模块间的关系,在运行主函数的过程中会调用摆放皇后的函数模块,在摆放皇后的函数模块中,又会调用判断皇后位置是否摆放正确的判断模块。
三、详细设计抽象数据类型中定义的各种操作算法实现(用N-S图描述)对于求解八皇后问题的非递归算法,N-S图如下:对于八皇后问题求解的递归算法,N-S图如下:四、调试分析1.程序在调式过程中出现的问题及解决方法由于对于C语言编程问题掌握的并非十分熟练,因而在程序的调试过程中出现了一些问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件工程上机报告实验名称:八皇后问题图形界面求解姓名:郭恂学号:2011011435班级:11级数学班中国石油大学(北京)计算机科学与技术系一、试验程序截图:点击显示下一组解即可显示下一组解:同样的,如果点击上一组解即可显示上一组解。
若在第1组解时点击显示上一组解会弹出报错提示框。
同样,若在第92组解点击显示下一组解也会弹出报错提示框:二、程序代码程序使用Java语言编写,编写环境为jdk1.6.0_18。
使用编程开发环境eclipse.exe编写。
本程序创建了两个类,两个类在同一个工程中。
其中Queen类的作用仅仅用来保存八皇后问题计算结果的数据,便于画图时使用。
本程序大概由两部分组成,第一部分是解八皇后问题,第二部分是画图。
程序源代码为:类1:public class Queen{public int[] x=new int[8];public int[] y=new int[8];public String name;}类2:import javax.swing.*;import java.awt.event.*;import java.awt.*;import javax.swing.JOptionPane;public class bahuanghou extends JFrame implements ActionListener {//JLabel[] l;int number=0; //当前显示的解的编号int sum=0; //所有解得数量JLabel l2;JButton b1,b2; //b1为显示下一组解得按钮,b2为显示上一组解得按钮。
Queen[] q=new Queen[128]; //得到的解储存在Queen类的数组里面。
private Image bomb1=Toolkit.getDefaultToolkit().getImage("D:\\qizi1.JPG"); //黑格棋子为bomb1private Image bomb2=Toolkit.getDefaultToolkit().getImage("D:\\qizi2.JPG"); //白格棋子为bomb2public bahuanghou() //构造方法,初始化窗口。
{Queen(); //调用Queen函数解八皇后问题。
this.setBounds(400, 200, 500, 500); //设置窗体大小为(500,500),起始位置为(400,200)this.setVisible(true); //设置窗体可视为truethis.setDefaultCloseOperation(EXIT_ON_CLOSE); //设置窗体右上角的功能this.setLayout(new BorderLayout()); //窗体采用边布局//北部l2=new JLabel("八皇后问题共有"+(sum)+"组解,当前为第"+(number+1)+"组解");this.add(l2,"North");//中部//中部用paint函数来画八皇后问题的解。
//南部JPanel p2=new JPanel(); //南部使用一个流布局的panel。
p2.setLayout(new FlowLayout());this.add(p2,"South");b2=new JButton("显示上一组解");b2.addActionListener(this); //按钮注册事件监听器p2.add(b2);b1=new JButton("显示下一组解");b1.addActionListener(this); //按钮注册事件监听器p2.add(b1);}//解八皇后问题的函数public void Queen(){int num=0; //记录解得数量。
与类成员sum作用相同,只不过sum保存在类中,num用于给Queen的数组赋值。
int n=8; //皇后上限为8int[] x=new int[9]; //原本应该是长度为8的数组,这里为了后续计算方便,采用长度为9的数组,其中x[0]=0时不占任何内容的。
x[1]为第一行的皇后棋子。
x[0]=x[1]=0; //x[i]代表第i行的皇后,x[i]的值代表该皇后所在的列数。
int k=1;while(k > 0){x[k]+=1; //转到下一行while (x[k]<=n && this.Place(k,x)==false){//如果无解,最后一个皇后就会安排到格子外面去x[k]+=1;}if(x[k]<=n){//第k个皇后仍被放置在格子内,有解if(k==n){this.q[num]=new Queen(); //开拓保存解得空间for(int i=0;i<n;i++){q[num].x[i]=i; //第i个皇后所在的行数为iq[num].y[i]=x[i+1]-1; //第i个皇后所在的列数为x[i+1]-1}num++;sum++;}else{k++;x[k]=0; //转到下一行}}else//第k个皇后已经被放置到格子外了,没解,回溯k--; //回溯}}boolean Place(int k,int[] x) //判断第k个皇后能否放在第x[k]列上。
{int i = 1;while( i < k){if( x[i]==x[k] || (Math.abs(x[i]-x[k]) == Math.abs(i-k)) ) //x[i]==x[k]用来判断第K个是否与之前的皇后在同一列。
(Math.abs(x[i]-x[k]) == Math.abs(i-k))用来判断第k个皇后是否与之前的皇后在同一条斜线上。
return false;i++;}return true;}public void paint(Graphics g){super.paint(g);//底色为灰g.setColor(Color.GRAY);g.fillRect(50,50,400,400);//画棋盘int i,j;for(i=0;i<8;i++) //黑白格相间,最左上角(0,0)为白格。
for(j=0;j<8;j++){if((i+j)%2==0)g.setColor(Color.WHITE); //i+j为偶数时是白格,i+j为奇数时是黑格。
else g.setColor(Color.BLACK);g.fillRect(70+45*i,70+45*j,45,45);}//画棋子for(i=0;i<8;i++){if((this.q[number].x[i]+this.q[number].y[i])%2==0) //棋子的x+y为偶数时用白格棋子bomb2g.drawImage(bomb2,70+this.q[number].y[i]*45,70+this.q[number].x[i]*45, 45, 45, this);else if((this.q[number].x[i]+this.q[number].y[i])%2==1) //棋子的x+y为奇数时用黑格棋子bomb1g.drawImage(bomb1,70+this.q[number].y[i]*45,70+this.q[number].x[i]*45, 45, 45, this);}}public void actionPerformed(ActionEvent e) //事件监听器{if(e.getSource()==b1) //事件源为按钮1时“显示下一组解”。
{if(number<(sum-1)){this.number++; //当前显示解序号+1l2.setText("八皇后问题共有"+(sum)+"组解,当前为第"+(number+1)+"组解"); //提示信息变更。
repaint(); //重画}else JOptionPane.showMessageDialog(null,"这已经是最后一组解了!"); //越界时提示报错,然后什么也不做。
}else if(e.getSource()==b2) //事件源为按钮2时"显示上一组解",与按钮b2同理。
{if(number>0){this.number--;l2.setText("八皇后问题共有"+(sum)+"组解,当前为第"+(number+1)+"组解");repaint();}else JOptionPane.showMessageDialog(null,"这已经是第一组解了!");}}public static void main(String args[]){new bahuanghou(); //主函数中新建实例,开拓窗体。
}}三、程序编写过程。
首先我把程序分为两部分:第一部分的任务是构建窗体,画棋盘、棋子。
第二部分的任务是求解八皇后问题。
我首先考虑的时第一部分如何能获得第二部分求得的解。
如是我编写了public class Queen ,并用它创建了一个数组,这样第二部分中求得解保存在数组中,第一部分绘图时可以随时取出来使用。
之后我先开始编写的第一部分,构建窗体,设置窗体的大小为(500,,500)设置布局,可见,将按钮和标签加入窗体中后,我开始考虑如何绘制棋盘、棋子,以及相应的解的显示方法。
我首先想以其中(400,400)的区域作为画布,长和宽分别留了100像素,也就是上下左右各50像素。
涂为灰色。
然后我去网上查找国际象棋棋盘的图像,棋盘横竖为8个格子。
如果画布上画满棋盘的话每个格子的长和宽都是(400/8)=50的,但我觉得整个棋盘占满画布应该不太好看(因为背景颜色太淡了,会与棋盘中白色的格子混淆),于是我就想让棋盘占据画布的中央部分,那么每个格子长和宽分别为45,45。
这样就占了45*8=360的空间。
长和款分别留了40像素,也就是上下左后各20像素。
具体坐标如图所示。
然后考虑棋盘格子的绘制,棋盘黑白格相间,每行、每列格子数目均为8。
每个格子长和宽分别为45,45。
编写了一个循环很简单就绘制出来了。
之后是如何让棋子出现在棋盘上,这也是整个程序最困扰我的地方。