数据结构实习-迷宫(基于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个数,分别表示\n点的个数,边的个数,起点,终点。\n之后每一行输入4个数u、v、d、p,\n表示u和v之间有一条长度为d的路,需\n要p的花费。给出图,可计算起点到终\n点的最短距离及其花费,如果最短距\n离有多条路线,则输出花费最少的。"); 18 shuoming->setGeometry(10, 5, 200, 120); 19 20 te_datain = new QTextEdit(this); 21 te_datain->setText("3 2 1 3\n1 2 5 6\n2 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('\n',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>