问题描述:
残缺棋盘是一个有 2 k ∗ 2 k 2^k*2^k 2k∗2k个方格的棋盘,其中恰有一个方格残缺。现在要求用三格板覆盖残缺棋盘,覆盖过程中两个三格板不能重叠,不能覆盖残缺方格,但必须覆盖其它的所有方格。问如何去覆盖该残缺棋盘(给出覆盖方案)?
为了完成这个作业,我找了很多代码。找到了两个我觉得比较有用的代码,在这个基础上进行了功能的改进。
棋盘覆盖过程演示
它们的代码标注很少,我在读的时候增加了不少自己的标注,可以帮助更好的理解,但也有些标注可能有错误。
界面:
详细代码实现:
package code;
import java.util.Random;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
//westPanel为放置按钮的容器,采用GridBagLayout布局
//随机产生4种模板的颜色,如果需要固定颜色,可从130行开始修改
class MainFrame implements ActionListener,ItemListener{
FlowLayout FLayout = new FlowLayout();
JLabel menuLabel = new JLabel("控制项");
JSlider sizeSlider = new JSlider(1,5);
JLabel sizeLabel = new JLabel("棋盘大小(1-5)");
JSlider speedSlider = new JSlider(100,1000);
JLabel speedLabel = new JLabel("覆盖时间(100-1000)");
JButton ok = new JButton("开始");
JButton sp = new JButton("暂停");
JButton up = new JButton("上一步");
JButton ne = new JButton("下一步");
JPanel westPanel = new JPanel();
static JLabel[][] chess= new JLabel[32][37];
JPanel boardPanel = new JPanel(new GridLayout(32,37));
static JFrame jf = new JFrame("残缺棋盘算法");
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
static Temp[] temp = new Temp[4];
static int speed=100,size=1,bia;
static int[] colorCount = new int[5], brokenPos= new int[2];
static int[][] color= new int [32][32], colorStaPos = new int[4][2],spatialTem= {
{
0,0},{
0,1},{
1,0},{
1,1}};
static int[][][] stepList= new int[350][3][2];
public static boolean now = true;
public static int a; //全局变量
public static int current = 0;
public MainFrame() {
//根据屏幕高设置窗口大小
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
int screenHeight = (int) screensize.getHeight();
jf.setLayout(new BorderLayout());
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(jf.getGraphicsConfiguration());
screenHeight -= screenInsets.bottom;
jf.setSize(new Dimension((int)(screenHeight*1.43),screenHeight));
westPanel.setLayout(gbl);
//滑动条 size设置
sizeSlider.setMinimum(1);
sizeSlider.setSnapToTicks(true); //true时,每一次调整后滑块都要对齐到最接近的标尺处
sizeSlider.addChangeListener(new ChangeListener(){
//通过输入得到size大小
@Override
public void stateChanged(ChangeEvent e) {
size = sizeSlider.getValue();
System.out.printf("%d\n", size); //控制台输出得到的size大小
}
});
//滑动条 速度设置
speedSlider.setValue(100);
speedSlider.addChangeListener(