基于Qt实现的算法可视化(棋盘覆盖)

接上篇基于Qt实现的算法可视化(棋盘覆盖、汉诺塔、旅行商),本篇主要给出棋盘覆盖问题的具体实现。

该篇代码给出了棋盘覆盖分治算法的动态实现过程,先是通过DAC来生成染色顺序的序列,然后通过计时器来依次将每个方格染色,并不断的更新棋盘。具体见代码注释。

头文件:

#ifndef CHESSCOVER_H
#define CHESSCOVER_H

#include <QWidget>
#include <QPushButton>
#include <QPixmap>
#include <QPainter>
#include <QMouseEvent>
#include <QLineEdit>
#include <QLabel>
#include <QTimer>

class chesscover : public QWidget
{
   
    Q_OBJECT
public:
    explicit chesscover(QWidget *parent = 0);

    void return_main(); //返回主界面

    void paintline();   //画线,生成未染色的棋盘
    void setgrim();     //设置单元格的大小和数目
    void setcolor();    //设置调色盘

    void paintboard();  //填充棋盘
    void DAC(int tx, int ty, int sx, int sy, int size); //分治法填充
    void updateBySq();  //根据生成的染色顺序表,对棋盘进行染色

protected:
    void paintEvent(QPaintEvent *ev);       //绘图事件,用来绘制、更新棋盘
    void mousePressEvent(QMouseEvent *ev);  //鼠标点击事件,主要用于设置特殊点

signals:
    void return_sign(); //返回主界面的信号

public slots:

private:
    //b1为“返回主界面”按钮,b2为“绘制棋盘”按钮,b3为“填充棋盘”按钮
    QPushButton b1, b2, b3;

    QPixmap board = QPixmap(501, 501);  //棋盘图像
    QLineEdit lineEdit;                 //行文本编辑器,用来读取k值
    QLabel label;                       //用于显示行文本编辑器的输入提示

    int color[1200][3];                 //调色器,color[i]的三个元素分别对应第i种颜色的rgb参数
    int gridcolor[50][50];              //储存棋盘上各个方格的颜色
    int Sqnum, tile;                    //Sqnum记录染色顺序,tile用于指示当前方格颜色
    struct Node{
   int x,y;} Sq[1200];     //以染色的先后顺序来储存各点的横纵坐标
    QTimer timer;                       //染色计时器
    int Sqnow;                          //染色指针

    int k;                      //棋盘边长为2^k
    double gridsize;            //单位方格的大小
    int gridnum;                //一条边上单位方格的数量
    int signx=-1, signy=-1;     //特殊点的坐标

    bool click, paintFlag, paintlineFlag, select;       //用于辅助鼠标点击和绘图的变量
};

#endif // CHESSCOVER_H

cpp文件:

#include "chesscover.h"
#include <QPen>
#include <QBrush>
#include <QString>
#include <QDebug>
#include <QtGlobal>
#include <QMessageBox>
#include <QFont>

chesscover::chesscover(QWidget *parent) : QWidget(parent), click(false),
    paintFlag(false), paintlineFlag(false), select(false)
{
   
    //窗口设置
    setWindowTitle("棋盘覆盖问题");   //设置窗口标题
    resize(1000, 650);                 //设置窗口大小

    //按钮设置
    b1.setParent(this); b2.setParent(this); b3.setParent(this);                 //设置父类
    b1.setText("返回主界面"); b2.setText("绘制棋盘"); b3.setText("填充棋盘");   //设置按钮内容
    b1.move(725, 475); b2.move(725, 275); b3.move(725, 375);                    //设置按钮位置
    b1.resize
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值