• 数据结构实习-迷宫(基于Qt实现)


    预览效果:

    Maze.pro文件

     1 #-------------------------------------------------
     2 #
     3 # Project created by QtCreator 2016-12-26T14:10:37
     4 #
     5 #-------------------------------------------------
     6 
     7 QT       += core gui
     8 
     9 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    10 
    11 TARGET = Maze
    12 TEMPLATE = app
    13 
    14 
    15 SOURCES += main.cpp
    16         mainwindow.cpp 
    17     MAZE.cpp 
    18     DijkstraWindow.cpp 
    19     head.cpp
    20 
    21 HEADERS  += mainwindow.h 
    22     MAZE.h 
    23     DijkstraWindow.h 
    24     head.h
    25 
    26 FORMS += 
    27     head.ui
    28 
    29 RESOURCES += 
    30     img.qrc
    DijkstraWindow.h文件
     1 #ifndef DIJKSTRAWINDOW_H
     2 #define DIJKSTRAWINDOW_H
     3 
     4 #include <QWidget>
     5 #include <iostream>
     6 #include <QTime>
     7 #include <QLineEdit>
     8 #include <QPushButton>
     9 #include <QPainter>
    10 #include <QLabel>
    11 #include <QMessageBox>
    12 #include <QDebug>
    13 #include <QKeyEvent>
    14 #include <QPixmap>
    15 #include <QTextEdit>
    16 
    17 class DijkstraWindow : public QWidget
    18 {
    19     Q_OBJECT
    20 
    21 public:
    22 
    23 
    24     DijkstraWindow(QWidget *parent = 0);
    25 //    void paintEvent(QPaintEvent *);
    26 //    void keyPressEvent(QKeyEvent *e);
    27     void dijkstra();
    28     void set_n(int tn){n = tn;}
    29     int get_n(){return n;}
    30     void set_m(int tm){m = tm;}
    31     int get_m(){return m;}
    32     ~DijkstraWindow();
    33 private:
    34     QTextEdit *te_datain;
    35     QPushButton *queding;
    36     QLabel *bushu, *huafei, *bushuOut, *huafeiOut, *shuoming;
    37     int n, m, s, t;
    38 private slots:
    39     void startDijkstra();
    40 };
    41 #endif // DIJKSTRAWINDOW_H

    head.h文件

     1 #ifndef HEAD_H
     2 #define HEAD_H
     3 
     4 #include <QWidget>
     5 #include "DijkstraWindow.h"
     6 #include "mainwindow.h"
     7 
     8 namespace Ui {
     9 class Head;
    10 }
    11 
    12 class Head : public QWidget
    13 {
    14     Q_OBJECT
    15 
    16 public:
    17     explicit Head(QWidget *parent = 0);
    18     ~Head();
    19 
    20 private slots:
    21     void on_pushButton_clicked();
    22 
    23     void on_pushButton_2_clicked();
    24 
    25 private:
    26     Ui::Head *ui;
    27     DijkstraWindow d;
    28     MainWindow w;
    29 };
    30 
    31 #endif // HEAD_H

    mainwindow.h文件

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3 
     4 #include "MAZE.h"
     5 #include <QMainWindow>
     6 #include <QWidget>
     7 #include <iostream>
     8 #include <QTime>
     9 #include <QLineEdit>
    10 #include <QPushButton>
    11 #include <QPainter>
    12 #include <QLabel>
    13 #include <QMessageBox>
    14 #include <QDebug>
    15 #include <QKeyEvent>
    16 #include <QPixmap>
    17 
    18 class MainWindow : public QWidget
    19 {
    20     Q_OBJECT
    21 
    22 public:
    23     MainWindow(QWidget *parent = 0);
    24     void paintEvent(QPaintEvent *);
    25     void keyPressEvent(QKeyEvent *e);
    26     ~MainWindow();
    27 private:
    28     QLabel *ql_shuru,*ql_bushu, *ql_bushuOut, *yongshi, *yongshiOut;
    29     QLineEdit *infile;
    30     QPushButton *queding;
    31     QPushButton *zhaolu;
    32     MAZE *m;
    33     int X = 1;
    34     int Y = 0;
    35     bool bfs_fg = false;
    36 private slots:
    37     void startMaze();
    38     void startBFS();
    39 };
    40 
    41 #endif // MAINWINDOW_H

    MAZE.h文件

     1 #ifndef MAZE_H
     2 #define MAZE_H
     3 
     4 static const int N = 1000;
     5 
     6 class MAZE
     7 {
     8 public:
     9     int maze[N][N];
    10     struct point
    11     {
    12         int x, y, pre;
    13     }q[N*N], path[N*N];
    14     MAZE();
    15     void set_n(int tn);
    16     int get_n();
    17     int get_len_path(){return len_path;}
    18     void set_len_path(int tn){len_path = tn;}
    19     void printPath()
    20     {
    21         bfs();
    22         for(int i = len_path-1; i >= 0; i--)
    23             if(maze[path[i].x][path[i].y]==0)
    24                 maze[path[i].x][path[i].y] = 6;
    25     }
    26     void recoverPath()
    27     {
    28         for(int i = len_path-1; i >= 0; i--)
    29             if(maze[path[i].x][path[i].y]==6)
    30                 maze[path[i].x][path[i].y] = 0;
    31     }
    32     void mazeInit();
    33     int searchPath(int x, int y);
    34     void print();
    35     ~MAZE();
    36 private:
    37     int n, len_path, nn;
    38     void bfs();
    39     void getPath(int pos);
    40 };
    41 
    42 #endif // MAZE_H
    DijkstraWindow.cpp文件
      1 #include "DijkstraWindow.h"
      2 #include <cstring>
      3 #include <iostream>
      4 #include <QString>
      5 #include <QStringList>
      6 
      7 static const int maxn = 1005;
      8 static const int inf = 9999999;
      9 int Tu_dist[maxn][maxn], Tu_pay[maxn][maxn], dis[maxn], pay[maxn], book[maxn];
     10 
     11 DijkstraWindow::DijkstraWindow(QWidget *parent)
     12     : QWidget(parent)
     13 {
     14     this->setFixedSize(220,450);
     15 
     16     shuoming = new QLabel(this);
     17     shuoming->setText("说明:第一行输入4个数,分别表示
    点的个数,边的个数,起点,终点。
    之后每一行输入4个数u、v、d、p,
    表示u和v之间有一条长度为d的路,需
    要p的花费。给出图,可计算起点到终
    点的最短距离及其花费,如果最短距
    离有多条路线,则输出花费最少的。");
     18     shuoming->setGeometry(10, 5, 200, 120);
     19 
     20     te_datain = new QTextEdit(this);
     21     te_datain->setText("3 2 1 3
    1 2 5 6
    2 3 4 5");
     22     te_datain->setGeometry(10, 130, 200, 220);
     23 
     24     queding = new QPushButton(this);
     25     queding->setText("确定");
     26     queding->setGeometry(60, 370, 100, 20);
     27 
     28     bushu = new QLabel(this);
     29     bushu->setText("最短路径长度:");
     30     bushu->setGeometry(40, 400, 80, 20);
     31 
     32     bushuOut = new QLabel(this);
     33     bushuOut->setText("0");
     34     bushuOut->setGeometry(140, 400, 20, 20);
     35 
     36     huafei = new QLabel(this);
     37     huafei->setText("花费:");
     38     huafei->setGeometry(85, 425, 40, 20);
     39 
     40     huafeiOut = new QLabel(this);
     41     huafeiOut->setText("0");
     42     huafeiOut->setGeometry(140, 425, 20, 20);
     43 
     44     connect(queding,SIGNAL(clicked()),this,SLOT(startDijkstra()));
     45 }
     46 
     47 void DijkstraWindow::startDijkstra()
     48 {
     49 
     50     int a, b, d, p;
     51     //QString str = te_datain->toPlainText();
     52     int line_n=te_datain->document()->lineCount();
     53     if(line_n != 0)
     54     {
     55         for(int i = 0; i < line_n; i++)
     56         {
     57             QString str=te_datain->toPlainText().section('
    ',i-line_n,i-line_n,QString::SectionSkipEmpty);
     58             QStringList strlist=str.split(" ");
     59             if(i == 0)
     60             {
     61                 n = strlist[0].toInt();
     62                 m = strlist[1].toInt();
     63                 s = strlist[2].toInt();
     64                 t = strlist[3].toInt();
     65                 for(int i = 0; i <= n; i++)
     66                     for(int j = 0; j <= n; j++)
     67                     {
     68                         Tu_dist[i][j] =inf;
     69                         Tu_pay[i][j] = inf;
     70                     }
     71                 //std::cout<<n<<" "<<m<<" "<<s<<" "<<t<<std::endl;
     72             }else
     73             {
     74                 a = strlist[0].toInt();
     75                 b = strlist[1].toInt();
     76                 d = strlist[2].toInt();
     77                 p = strlist[3].toInt();
     78                 if(d<Tu_dist[a][b])
     79                 {
     80                     Tu_dist[a][b] = Tu_dist[b][a] = d;
     81                     Tu_pay[a][b] = Tu_pay[b][a] = p;
     82                 }
     83                 //std::cout<<a<<" "<<b<<" "<<d<<" "<<p<<std::endl;
     84             }
     85         }
     86 
     87         for(int i = 1; i <= n; i++)
     88         {
     89             dis[i] = Tu_dist[s][i];
     90             pay[i] = Tu_pay[s][i];
     91         }
     92 
     93         memset(book, 0, sizeof(book));
     94         book[s] = 1;
     95         dis[s] = 0;
     96         pay[s] = 0;
     97 
     98         int mindist, u, v;
     99         for(int i = 1; i < n; i++)
    100         {
    101             mindist = inf;
    102             for(int j = 1; j <= n; j++)
    103             {
    104                 if(book[j]==0&&dis[j]<mindist)
    105                 {
    106                     mindist = dis[j];
    107                     u = j;
    108                 }
    109             }
    110             book[u] = 1;
    111             for(int v = 1; v <= n; v++)
    112             {
    113                 if(!book[v] && Tu_dist[u][v]<inf)
    114                 {
    115                     if(dis[v]>dis[u]+Tu_dist[u][v])
    116                     {
    117                         dis[v] = dis[u]+Tu_dist[u][v];
    118                         pay[v] = pay[u]+Tu_pay[u][v];
    119                     }
    120                     else if(dis[v]==(dis[u]+Tu_dist[u][v]))
    121                         pay[v] = (pay[u]+Tu_pay[u][v])<pay[v]?pay[u]+Tu_pay[u][v]:pay[v];
    122                 }
    123             }
    124         }
    125         QString str;
    126         bushuOut->setText(str.setNum(dis[t]));
    127         huafeiOut->setText(str.setNum(pay[t]));
    128 
    129         update();
    130     }
    131 }
    132 
    133 DijkstraWindow::~DijkstraWindow()
    134 {
    135 
    136 }

    head.cpp文件

     1 #include "head.h"
     2 #include "ui_head.h"
     3 
     4 Head::Head(QWidget *parent) :
     5     QWidget(parent),
     6     ui(new Ui::Head)
     7 {
     8     ui->setupUi(this);
     9 }
    10 
    11 Head::~Head()
    12 {
    13     delete ui;
    14 }
    15 
    16 void Head::on_pushButton_clicked()
    17 {
    18     w.show();
    19 }
    20 
    21 void Head::on_pushButton_2_clicked()
    22 {
    23     d.show();
    24 }

    main.cpp文件

     1 #include "head.h"
     2 #include <QApplication>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication a(argc, argv);
     7     Head h;
     8     h.show();
     9 
    10     return a.exec();
    11 }

    mainwindow.cpp文件

      1 #include "mainwindow.h"
      2 #include "MAZE.h"
      3 #include <iostream>
      4 #include <time.h>
      5 //#include <QTimer>
      6 
      7 #define size 20
      8 using namespace std;
      9 MainWindow::MainWindow(QWidget *parent)
     10     : QWidget(parent)
     11 {
     12     int n = 31;
     13     m = new MAZE();
     14     m->set_n(n);
     15     m->mazeInit();
     16     m->print();
     17     //m->printPath();
     18     this->setWindowTitle("迷宫");
     19     this->setFixedSize((n+9)*size,n*size);
     20     //this->resize((n+10)*size,n*size);
     21     this->setFocus(Qt::MouseFocusReason);
     22     QPalette pa;
     23     pa.setColor(QPalette::WindowText,Qt::black);
     24     QFont ft;
     25     ft.setPointSize(14);
     26 
     27     ql_shuru = new QLabel(this);
     28     ql_shuru->setText("迷宫大小");
     29     ql_shuru->setPalette(pa);
     30     ql_shuru->setFont(ft);
     31     ql_shuru->setGeometry((n+2)*size, 2*size, 100, 20);
     32 
     33     infile = new QLineEdit(this);
     34     infile->setText("30");
     35     infile->setGeometry((n+2)*size, 4*size, 90, 20);
     36 
     37     queding = new QPushButton(this);
     38     queding->setText("创建");
     39     queding->setGeometry((n+3)*size, 6*size, 60,20);
     40 
     41     zhaolu = new QPushButton(this);
     42     zhaolu->setText("找最短路");
     43     zhaolu->setGeometry((n+3)*size, (n-6)*size, 60,20);
     44 
     45     ql_bushu = new QLabel(this);
     46     ql_bushu->setText("最短路步数");
     47     ql_bushu->setGeometry((n+2)*size, (n-4)*size, 60,20);
     48 
     49     //QString str;
     50     ql_bushuOut = new QLabel(this);
     51     //ql_bushuOut->setText(str.setNum(m->get_len_path()));
     52     ql_bushuOut->setText("0");
     53     ql_bushuOut->setGeometry((n+7)*size, (n-4)*size, 60,20);
     54 
     55     yongshi = new QLabel(this);
     56     yongshi->setText("用时");
     57     yongshi->setGeometry((n+4)*size, (n-2)*size, 60,20);
     58 
     59     yongshiOut = new QLabel(this);
     60     yongshiOut->setText("0");
     61     yongshiOut->setGeometry((n+7)*size, (n-2)*size, 60,20);
     62 
     63     connect(queding,SIGNAL(clicked()),this,SLOT(startMaze()));
     64     connect(zhaolu,SIGNAL(clicked()),this,SLOT(startBFS()));
     65 }
     66 
     67 MainWindow::~MainWindow()
     68 {
     69 
     70 }
     71 
     72 void MainWindow::paintEvent(QPaintEvent *)
     73 {
     74     QPainter painter(this);
     75     // 反走样  painter.setRenderHint(QPainter::Antialiasing, true);
     76     // 绘制图标    painter.drawPixmap(rect(), QPixmap(":/img/nwafu.jmp"));
     77     //painter.setPen(Qt::black);
     78     //painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色、宽度
     79     //painter.setPen(QPen(QColor(0, 160, 160), 1));
     80     int n = m->get_n();
     81     for(int i = 0; i < n; i++)
     82     {
     83         for(int j = 0; j < n; j++)
     84         {
     85             if(m->maze[i][j] ==1){
     86                 painter.setPen(Qt::darkCyan);
     87                 painter.setBrush(QBrush(Qt::darkCyan,Qt::SolidPattern));
     88                 painter.drawRect(QRect(j*size,i*size,size,size));
     89             }else if(m->maze[i][j] == 2){
     90 //                painter.setPen(Qt::darkMagenta);
     91 //                painter.setBrush(QBrush(Qt::darkMagenta,Qt::SolidPattern));
     92 //                painter.drawRect(QRect(j*size,i*size,size,size));
     93                 painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/new/prefix1/img/panda2.jpg").scaled(20,20));
     94             }else if(m->maze[i][j] == 3){
     95                 painter.setPen(Qt::red);
     96                 painter.setBrush(QBrush(Qt::red,Qt::SolidPattern));
     97                 painter.drawRect(QRect(j*size,i*size,size,size));
     98                 painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/new/prefix1/img/bamboo.jpg").scaled(20,20));
     99             }else if(m->maze[i][j] == 0){
    100                 painter.setPen(Qt::white);
    101                 painter.setBrush(QBrush(Qt::white,Qt::SolidPattern));
    102                 painter.drawRect(QRect(j*size,i*size,size,size));
    103             }else if(m->maze[i][j] == 6){
    104 //                painter.setPen(Qt::darkGray);
    105 //                painter.setBrush(QBrush(Qt::darkGray,Qt::SolidPattern));
    106 //                painter.drawRect(QRect(j*size,i*size,size,size));
    107                 painter.drawPixmap(j*20,i*20,20,20,QPixmap(":/new/prefix1/img/foot.jpg").scaled(20,20));
    108             }
    109         }
    110     }
    111 }
    112 
    113 void MainWindow::keyPressEvent(QKeyEvent *e)
    114 {
    115     if(bfs_fg){
    116         m->recoverPath();
    117         bfs_fg = false;
    118         ql_bushuOut->setText("0");
    119         update();
    120     }
    121     int tx = X, ty = Y;
    122     int n = m->get_n();
    123     if(e->key()==87||e->key()==16777235)//
    124     {
    125         if(X>0 && m->maze[X-1][Y] != 1)
    126         {
    127             X=X-1;
    128         }
    129     }
    130     else if(e->key()==83||e->key()==16777237)//
    131     {
    132         if(X<n-1 && m->maze[X+1][Y] != 1)
    133         {
    134             X=X+1;
    135         }
    136     }
    137     else if(e->key()==65||e->key()==16777234)//
    138     {
    139         if(Y>0 && m->maze[X][Y-1] != 1)
    140         {
    141             Y=Y-1;
    142         }
    143     }
    144     else if(e->key()==68||e->key()==16777236)//
    145     {
    146 
    147         if(Y<n-1 && m->maze[X][Y+1] != 1)
    148         {
    149             Y=Y+1;
    150         }
    151     }
    152     int tmp = m->maze[X][Y];
    153     if(tmp == 3){
    154         QMessageBox::information(this,"提示","到达终点",QMessageBox::Yes);
    155     }else{
    156         m->maze[X][Y] = m->maze[tx][ty];
    157         m->maze[tx][ty] = tmp;
    158     }
    159     update();
    160 }
    161 
    162 void MainWindow::startMaze()
    163 {
    164     int n = infile->text().toInt();
    165     //n = 2*n+2;
    166     if(n<15)n = 15;
    167     if(n>100)n = 100;
    168     if(n%2 == 0)n++;
    169     this->setFixedSize((n+9)*size,n*size);
    170     //this->resize((n+10)*size,n*size);
    171 
    172    // ql_shuru->setText("请输入迷宫的大小");
    173     ql_shuru->setGeometry((n+2)*size, 2*size, 100, 20);
    174     infile->setGeometry((n+2)*size, 4*size, 90, 20);
    175     //queding->setText("创建");
    176     queding->setGeometry((n+3)*size, 6*size, 60,20);
    177     //zhaolu->setText("找最短路");
    178     zhaolu->setGeometry((n+3)*size, (n-6)*size, 60,20);
    179     //ql_bushu->setText("最短路步数");
    180     ql_bushu->setGeometry((n+2)*size, (n-4)*size, 60,20);
    181     ql_bushuOut->setText("0");
    182     ql_bushuOut->setGeometry((n+7)*size, (n-4)*size, 60,20);
    183     yongshi->setGeometry((n+4)*size, (n-2)*size, 60,20);
    184     yongshiOut->setGeometry((n+7)*size, (n-2)*size, 60,20);
    185     m->set_n(n);
    186     m->mazeInit();
    187     X = 1, Y = 0;
    188     this->setFocus(Qt::MouseFocusReason);
    189     update();
    190 }
    191 
    192 void MainWindow::startBFS()
    193 {
    194     time_t start, end;
    195     time(&start);
    196     m->printPath();
    197     time(&end);
    198     double cost = difftime(end,start);
    199     QString str;
    200     ql_bushuOut->setText(str.setNum(m->get_len_path()));
    201     yongshiOut->setText(str.setNum(cost));
    202     //cout<<"ok"<<endl;
    203     bfs_fg = true;
    204     this->setFocus(Qt::MouseFocusReason);
    205     update();
    206 }

    MAZE.cpp文件

      1 #include "MAZE.h"
      2 #include <iostream>
      3 #include <windows.h>
      4 #include <cstdio>
      5 #include <cmath>
      6 #include <time.h>
      7 #include <cstring>
      8 using namespace std;
      9 int fa[N*N];
     10 int dx[4] = {1, 0, -1, 0};
     11 int dy[4] = {0, 1, 0, -1};
     12 
     13 MAZE::MAZE(){}
     14 
     15 void MAZE::set_n(int tn)
     16 {
     17     n = tn;
     18     nn = n/2;
     19 }
     20 
     21 int MAZE::get_n()
     22 {
     23     return n;
     24 }
     25 
     26 void MAZE::print()
     27 {
     28     bfs();
     29 //    for(int i = 0; i < n; i++)
     30 //    {
     31 //        for(int j = 0; j < n; j++)
     32 //            cout<<maze[i][j]<<" ";
     33 //        cout<<endl;
     34 //    }
     35 }
     36 
     37 void init()
     38 {
     39     for(int i = 0; i < N*N; i++)
     40         fa[i] = i;
     41 }
     42 
     43 int getfa(int x)
     44 {
     45     if(fa[x] == x)return x;
     46     else return fa[x] = getfa(fa[x]);
     47 }
     48 
     49 void Merge(int a, int b)
     50 {
     51     int af = getfa(a);
     52     int bf = getfa(b);
     53     if(af != bf)
     54         fa[bf] = af;
     55 }
     56 
     57 int tolist(int x, int y, int n)
     58 {
     59     return x*n+y;
     60 }
     61 
     62 void MAZE::mazeInit()
     63 {
     64     for(int i=0; i<=nn*2+2; ++i)
     65         for(int j=0; j<=nn*2+2; ++j)
     66             maze[i][j] = 1;
     67 
     68     for(int i=0, j=2*nn+2; i<=2*nn+2; ++i)
     69     {
     70         maze[i][0] = 0;
     71         maze[i][j] = 0;
     72     }
     73     for(int i=0, j=2*nn+2; i<=2*nn+2; ++i)
     74     {
     75         maze[0][i] = 0;
     76         maze[j][i] = 0;
     77     }
     78     maze[2][1] = 2;
     79     maze[2*nn][2*nn+1] = 3;
     80 
     81     srand((unsigned)time(NULL));
     82     searchPath(rand()%nn+1, rand()%nn+1);
     83 
     84     for(int i = 0; i < n; i++)
     85     {
     86         for(int j = 0; j < n; j++)
     87         {
     88             maze[i][j] = maze[i+1][j+1];
     89         }
     90     }
     91 
     92     len_path = 0;
     93 //    int sx, sy, ex, ey, x, y;
     94 //    init();
     95 //    for(int i = 0; i < n; i++)
     96 //        for(int j = 0; j < n; j++)
     97 //            maze[i][j] = 1;
     98 //    for(int i = 1; i < n; i++)
     99 //    {
    100 //        if(i&1)
    101 //            for(int j = 1; j < n; j+=2)
    102 //                maze[i][j] = 0;
    103 //    }
    104 //    //print(n);
    105 //    //cout<<"*********************"<<endl;
    106 //    srand(time(NULL));
    107 //    int d;
    108 //    int tx1, ty1, tx2, ty2;
    109 //    sx = sy = 1;
    110 //    ex = ey = n-3;
    111 
    112 //    //cout<<"ok"<<endl;
    113 //    maze[sx][sy] = maze[ex][ey] = 0;
    114 //    while(getfa(tolist(sx, sy, n)) != getfa(tolist(ex, ey, n)))
    115 //    {
    116 //        do
    117 //        {
    118 //            x = rand()%(n-2)+1;
    119 //            y = (rand()+2333)%(n-2)+1;
    120 //        }
    121 //        while(maze[x][y] != 1);
    122 //        d = x%2;
    123 //        if(!d)
    124 //        {
    125 //            tx1 = x+1;
    126 //            ty1 = y;
    127 //            tx2 = x-1;
    128 //            ty2 = y;
    129 //            if(getfa(tolist(tx1, ty1, n)) != getfa(tolist(tx2, ty2, n)))
    130 //            {
    131 //                maze[x][y] = 0;
    132 //                Merge(tolist(tx1, ty1, n), tolist(tx2, ty2, n));
    133 //            }
    134 //        }
    135 //        else
    136 //        {
    137 //            tx1 = x;
    138 //            ty1 = y+1;
    139 //            tx2 = x;
    140 //            ty2 = y-1;
    141 //            if(getfa(tolist(tx1, ty1, n)) != getfa(tolist(tx2, ty2, n)))
    142 //            {
    143 //                maze[x][y] = 0;
    144 //                Merge(tolist(tx1, ty1, n), tolist(tx2, ty2, n));
    145 //            }
    146 //        }
    147 //    }
    148 //    for(int i = 0; i < n; i++)
    149 //    {
    150 //        maze[i][n-1] = 1;
    151 //        maze[n-1][i] = 1;
    152 //    }
    153 //    maze[sx][sy] = 2;
    154 //    maze[ex][ey] = 3;
    155     //print();
    156 }
    157 
    158 int MAZE::searchPath(int x, int y)
    159 {
    160     static int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
    161     int zx = x*2;
    162     int zy = y*2;
    163     int next, turn, i;
    164     maze[zx][zy] = 0;
    165     turn = rand()%2 ? 1 : 3;
    166     for(i=0, next=rand()%4; i<4; ++i, next=(next+turn)%4)
    167         if(maze[zx+2*dir[next][0]][zy+2*dir[next][1]] == 1)
    168         {
    169             maze[zx+dir[next][0]][zy+dir[next][1]] = 0;
    170             searchPath(x+dir[next][0], y+dir[next][1]);
    171         }
    172     return 0;
    173 }
    174 
    175 void MAZE::getPath(int pos)
    176 {
    177     while(pos != -1)
    178     {
    179         path[len_path].x = q[pos].x;
    180         path[len_path].y = q[pos].y;
    181         len_path++;
    182         pos = q[pos].pre;
    183     }
    184 }
    185 
    186 void MAZE::bfs()
    187 {
    188     int front, tail, sx, sy;
    189     for(int i = 0; i < n; i++)
    190         for(int j = 0; j < n; j++)
    191             if(maze[i][j] == 2)
    192             {
    193                 sx = i; sy = j;
    194             }
    195     front = tail = 0;
    196     q[tail].x = sx;
    197     q[tail].y = sy;
    198     q[tail].pre = -1;
    199     tail++;
    200     int x, y, nx, ny;
    201     bool fg = false;
    202     while(front < tail)
    203     {
    204         x = q[front].x;
    205         y = q[front].y;
    206         for(int i = 0; i < 4; i++)
    207         {
    208             nx = x+dx[i];
    209             ny = y+dy[i];
    210             if(nx>=0&&nx<n&&ny>=0&&ny<n&&maze[nx][ny]==0)
    211             {
    212                 maze[nx][ny] = 5;
    213                 q[tail].x = nx;
    214                 q[tail].y = ny;
    215                 q[tail].pre = front;
    216                 tail++;
    217             }
    218             if(maze[nx][ny] == 3){
    219                 q[tail].x = nx;
    220                 q[tail].y = ny;
    221                 q[tail].pre = front;
    222                 tail++;
    223                 fg = true;
    224                 len_path = 0;
    225                 path[len_path].x = nx;
    226                 path[len_path].y = ny;
    227                 len_path++;
    228                 getPath(front);
    229             }
    230         }
    231         if(fg)break;
    232         front++;
    233     }
    234     for(int i = 0; i < n; i++)
    235         for(int j = 0; j < n; j++)
    236             if(maze[i][j] == 5)
    237                 maze[i][j] = 0;
    238 }

    head.ui文件

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <ui version="4.0">
      3  <class>Head</class>
      4  <widget class="QWidget" name="Head">
      5   <property name="enabled">
      6    <bool>true</bool>
      7   </property>
      8   <property name="geometry">
      9    <rect>
     10     <x>0</x>
     11     <y>0</y>
     12     <width>351</width>
     13     <height>220</height>
     14    </rect>
     15   </property>
     16   <property name="mouseTracking">
     17    <bool>false</bool>
     18   </property>
     19   <property name="windowTitle">
     20    <string>Maze</string>
     21   </property>
     22   <property name="windowIcon">
     23    <iconset resource="img.qrc">
     24     <normaloff>:/new/prefix1/img/xingong.jpg</normaloff>:/new/prefix1/img/xingong.jpg</iconset>
     25   </property>
     26   <property name="autoFillBackground">
     27    <bool>false</bool>
     28   </property>
     29   <widget class="QPushButton" name="pushButton">
     30    <property name="geometry">
     31     <rect>
     32      <x>50</x>
     33      <y>140</y>
     34      <width>101</width>
     35      <height>51</height>
     36     </rect>
     37    </property>
     38    <property name="font">
     39     <font>
     40      <family>微软雅黑</family>
     41      <pointsize>12</pointsize>
     42      <weight>75</weight>
     43      <bold>true</bold>
     44     </font>
     45    </property>
     46    <property name="styleSheet">
     47     <string notr="true">background: rgb(0, 170, 127)</string>
     48    </property>
     49    <property name="text">
     50     <string>Maze</string>
     51    </property>
     52   </widget>
     53   <widget class="QPushButton" name="pushButton_2">
     54    <property name="geometry">
     55     <rect>
     56      <x>200</x>
     57      <y>140</y>
     58      <width>101</width>
     59      <height>51</height>
     60     </rect>
     61    </property>
     62    <property name="font">
     63     <font>
     64      <family>微软雅黑</family>
     65      <pointsize>12</pointsize>
     66      <weight>75</weight>
     67      <bold>true</bold>
     68     </font>
     69    </property>
     70    <property name="cursor">
     71     <cursorShape>ArrowCursor</cursorShape>
     72    </property>
     73    <property name="styleSheet">
     74     <string notr="true">background: rgb(0, 170, 127)</string>
     75    </property>
     76    <property name="text">
     77     <string>Dijkstra</string>
     78    </property>
     79   </widget>
     80   <widget class="QFrame" name="frame">
     81    <property name="geometry">
     82     <rect>
     83      <x>-1</x>
     84      <y>-1</y>
     85      <width>351</width>
     86      <height>221</height>
     87     </rect>
     88    </property>
     89    <property name="styleSheet">
     90     <string notr="true">border-image: url(:/new/prefix1/img/mazeimg.jpg);</string>
     91    </property>
     92    <property name="frameShape">
     93     <enum>QFrame::StyledPanel</enum>
     94    </property>
     95    <property name="frameShadow">
     96     <enum>QFrame::Raised</enum>
     97    </property>
     98   </widget>
     99   <zorder>frame</zorder>
    100   <zorder>pushButton</zorder>
    101   <zorder>pushButton_2</zorder>
    102  </widget>
    103  <resources>
    104   <include location="img.qrc"/>
    105  </resources>
    106  <connections/>
    107 </ui>
  • 相关阅读:
    【BZOJ1294】围豆豆(SCOI2009)-状压+BFS
    【BZOJ3244】树的计数(NOI2013)-概率期望+数学证明
    【BZOJ4826】影魔(AHOI&HNOI2017)-线段树+离线
    【BZOJ3832】Rally(POI2014)-拓扑排序+最长路+堆
    【BZOJ4556】字符串(TJOI&HEOI2016)-后缀数组+二分+RMQ+主席树
    【BZOJ1029】建筑抢修(JSOI2007)-贪心+堆
    【BZOJ1057】棋盘制作(ZJOI2007)-DP+悬线法
    【BZOJ1025】游戏(SCOI2009)-数论+背包DP
    java日期操作
    list类型for遍历
  • 原文地址:https://www.cnblogs.com/Penn000/p/6306388.html
Copyright © 2020-2023  润新知