Skip to content

Commit f4baf70

Browse files
update
1 parent 46bc2a4 commit f4baf70

File tree

6 files changed

+92
-135
lines changed

6 files changed

+92
-135
lines changed

algorithm.cpp

+19-17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#include "algorithm.h"
22

3-
algorithm::algorithm(printList &p)
3+
algorithm::algorithm(algorithm::nodeMap &p)
44
{
55
algo = &distance::manhattan; //select distance algorithm
6+
// init map, close set, set start point, end point
67
for (int i = 0; i < p.size(); i++) {
78
std::vector<int> gt;
89
gt.resize(p[i].size(), 0);
@@ -30,18 +31,16 @@ void algorithm::setAlgo(int (distance::*algo)(int, int, int, int)) {
3031
this->algo = algo;
3132
}
3233

33-
algorithm::printList algorithm::start() {
34-
printList pList = astar(x1,y1,x2,y2,p,g,s,algo);
35-
p = pList.back();
36-
return pList;
34+
algorithm::nodeMap algorithm::start() {
35+
return astar(x1,y1,x2,y2,p,g,s,algo);
3736
}
3837

3938
int algorithm::distance::chebyshev(int i, int j, int x2, int y2) {
4039
return std::max(abs(i - x2), abs(j - y2)); //雪比切夫距离
4140
}
4241
int algorithm::distance::bfs(int i, int j, int x2, int y2) {
4342
i = j = x2 = y2 = 0;
44-
return 0; //BFS
43+
return 0; //雪比切夫距离
4544
}
4645
int algorithm::distance::euclidean(int i, int j, int x2, int y2) {
4746
return (int) (sqrt((i - x2) * (i - x2) + (j - y2) * (j - y2))); //欧几里德距离
@@ -50,36 +49,39 @@ int algorithm::distance::manhattan(int i, int j, int x2, int y2) {
5049
return abs(i - x2) + abs(j - y2); //曼哈顿距离
5150
}
5251

53-
algorithm::printList algorithm::astar(int x1, int y1, int x2, int y2, printList &p,
52+
algorithm::nodeMap algorithm::astar(int x1, int y1, int x2, int y2, algorithm::nodeMap p,
5453
const std::vector<std::vector<int>> g, std::vector<std::vector<int>> s,
5554
int(distance::*algo)(int, int, int, int)) {
56-
5755
if (p.empty() || p[0].empty() || (x1==x2&&y1==y2) ||
5856
x1<0||x2<0||y1<0||y2<0||x1>=p.size()||x2>=p.size()||y1>=p[0].size()||y2>=p[0].size())
5957
return p;
6058
int M = p.size();
6159
int N = p[0].size();
6260
distance dis;
63-
// init
6461
int c = 0;
6562
s[x1][y1] = 1;
6663
std::priority_queue<Node> q;
67-
q.push({x1, y1, 0, (dis.*algo)(x1, y1, x2, y2)});
68-
p[x1][y1].g = 0;
64+
Node n(x1, y1);
65+
n.h = (dis.*algo)(x1, y1, x2, y2);
66+
q.push(n);
67+
p[x1][y1] = n;
68+
6969
bool exit = false;
70-
// astar
7170
while (!q.empty()) {
72-
Node n = q.top();
71+
n = q.top();
7372
q.pop();
7473
for (int i = 0; i < 4; ++i) {
7574
int a = diri[i] + n.i;
7675
int b = dirj[i] + n.j;
7776
if (overflow(a, b, M, N) && s[a][b] != 1 && g[a][b] != 1) {
77+
Node t(a, b);
78+
t.g = n.g + 1;
79+
t.h = (dis.*algo)(a, b, x2, y2);
7880
c++;
79-
s[a][b] = 1;
80-
q.push({a, b, n.g + 1, (dis.*algo)(a, b, x2, y2)});
81+
p[a][b] = t;
8182
p[a][b].val = dir[i];
82-
p[a][b].g = n.g + 1;
83+
s[a][b] = 1;
84+
q.push(t);
8385
if (a == x2 && b == y2) {
8486
print(p,x2,y2);
8587
std::cout << "ok " << c << " step" << std::endl;
@@ -101,7 +103,7 @@ algorithm::printList algorithm::astar(int x1, int y1, int x2, int y2, printList
101103
bool algorithm::overflow(int a, int b, int m, int n) {
102104
return a >= 0 && b >= 0 && a < m && b < n;
103105
}
104-
void algorithm::print(printList &p, int x2, int y2) {
106+
void algorithm::print(algorithm::nodeMap &p, int x2, int y2) {
105107
int x = x2, y = y2;
106108
int len = 0;
107109
while (p[x][y].val != "S") {

algorithm.h

+26-25
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,27 @@
99
class algorithm
1010
{
1111
public:
12-
/*
13-
maze:
14-
startPoint
15-
endPoint
16-
printList:
17-
direction/state
18-
preNodePoint
19-
current cost
20-
predict cost
21-
total cost
22-
total distance
23-
*/
24-
class Maze
25-
{
26-
12+
struct Node {
13+
int i, j, g, h;
14+
std::string val;
15+
Node(int i, int j) {
16+
this->i = i;
17+
this->j = j;
18+
g = -1;
19+
h = 0;
20+
}
21+
bool operator<(const Node &a) const {
22+
if ((a.g + a.h) == (g + h)) {
23+
if (a.h == h) {
24+
return a.g < g;
25+
}
26+
return a.h < h;
27+
}
28+
return (a.g + a.h) < (g + h);
29+
}
2730
};
28-
Maze maze;
29-
algorithm(Maze maze);
31+
typedef std::vector<std::vector<Node>> nodeMap;
32+
algorithm(nodeMap &p);
3033
class distance {
3134
public:
3235
int manhattan(int i, int j, int x2, int y2);
@@ -35,22 +38,20 @@ class algorithm
3538
int bfs(int i, int j, int x2, int y2);
3639
};
3740
void setAlgo(int (algorithm::distance::*algo)(int, int, int, int));
38-
printList start();
41+
nodeMap start();
3942
private:
40-
41-
4243
const int diri[4] = {0, 1, 0, -1};
4344
const int dirj[4] = {1, 0, -1, 0};
4445
const char dir[4][4] = {"", "", "", ""};
4546
int x1, x2, y1, y2;
4647
int (distance::*algo)(int, int, int, int) = NULL;
47-
printList p;
48+
nodeMap p;
4849
std::vector<std::vector<int>> g;
4950
std::vector<std::vector<int>> s;
50-
void print(std::vector<std::vector<std::string> > &p, int x2, int y2);
51-
printList astar(int x1, int y1, int x2, int y2, printList &p,
52-
const std::vector<std::vector<int>> g,
53-
std::vector<std::vector<int>> s,
51+
void print(nodeMap &p, int x2, int y2);
52+
nodeMap astar(int x1, int y1, int x2, int y2,
53+
nodeMap p,
54+
const std::vector<std::vector<int>> g, std::vector<std::vector<int>> s,
5455
int(distance::*algo)(int, int, int, int));
5556
bool overflow(int a, int b, int m, int n);
5657
};

mainwindow.cpp

+44-32
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,57 @@ MainWindow::MainWindow(QWidget *parent) :
99
ui->setupUi(this);
1010
}
1111

12-
void MainWindow::printRect(int i, int j, QPainter painter, QColor color)
13-
{
14-
QPoint pos(20, 80);
15-
QRect rect(pos, QSize(W, W));
16-
const QPoint dir[] = {QPoint(0,W), QPoint(W,0)};
17-
pos = pos + i*dir[0] + j*dir[1];
18-
painter.setBrush(color);
19-
rect.moveTo(pos);
20-
painter.drawRect(rect);
21-
}
22-
2312
void MainWindow::paintEvent(QPaintEvent *) {
2413
if(p.empty()) {return;}
25-
// init
2614
QPainter painter(this);
2715
QPen pen(QColor(128,128,128));
2816
painter.setPen(pen);
17+
const QPoint start(20, 80);
18+
const QPoint dir[] = {QPoint(0,W), QPoint(W,0)};
2919
int length = 0;
3020
int steps = 0;
31-
// print
21+
QPoint pos = start;
3222
QRect rect(pos, QSize(W, W));
3323
for(int i = 0; i < p.size(); i++) {
3424
for(int j = 0; j < p[i].size(); j++) {
35-
if (p[i][j].g > printStep && p[i][j].val != "S" && p[i][j].val != "E" && p[i][j].val != "X") {
36-
printRect(i, j, painter, QColor(255,255,255));
25+
if (p[i][j].g > degree) { //TODO
26+
pos = start + i * dir[0] + j * dir[1];
27+
painter.setBrush(QColor(255, 255, 255));
28+
rect.moveTo(pos);
29+
painter.drawRect(rect);
3730
continue;
3831
}
39-
4032
if(p[i][j].val == "O") {
41-
printRect(i, j, painter, QColor(0,0,0));
33+
pos = start + i*dir[0] + j*dir[1];
34+
painter.setBrush(QColor(0,0,0));
35+
rect.moveTo(pos);
36+
painter.drawRect(rect);
4237
} else if (p[i][j].val == "X"){
43-
printRect(i, j, painter, QColor(255,255,255));
38+
pos = start + i*dir[0] + j*dir[1];
39+
painter.setBrush(QColor(255,255,255));
40+
rect.moveTo(pos);
41+
painter.drawRect(rect);
4442
} else if (p[i][j].val == "S"){
45-
printRect(i, j, painter, QColor(0,0,255));
43+
pos = start + i*dir[0] + j*dir[1];
44+
painter.setBrush(QColor(0,0,255));
45+
rect.moveTo(pos);
46+
painter.drawRect(rect);
4647
} else if (p[i][j].val == "E") {
47-
printRect(i, j, painter, QColor(255,0,0));
48+
pos = start + i*dir[0] + j*dir[1];
49+
painter.setBrush(QColor(255,0,0));
50+
rect.moveTo(pos);
51+
painter.drawRect(rect);
4852
} else if (p[i][j].val == "A"){
49-
printRect(i, j, painter, QColor(0,255,0));
53+
pos = start + i*dir[0] + j*dir[1];
54+
painter.setBrush(QColor(0,255,0));
55+
rect.moveTo(pos);
56+
painter.drawRect(rect);
5057
length++;
5158
} else {
52-
printRect(i, j, painter, QColor(255,255,0));
59+
pos = start + i*dir[0] + j*dir[1];
60+
painter.setBrush(QColor(255,255,0));
61+
rect.moveTo(pos);
62+
painter.drawRect(rect);
5363
steps++;
5464
}
5565
}
@@ -153,9 +163,10 @@ void MainWindow::resizeWindow() {
153163
// blank map
154164
p.clear();
155165
for (int i = 0; i < M; i++) {
156-
std::vector<algorithm::preNode> pt;
166+
std::vector<algorithm::Node> pt;
157167
for (int j = 0; j < N; j++) {
158-
algorithm::preNode node = {"X", -1};
168+
algorithm::Node node(i, j);
169+
node.val = "X";
159170
pt.push_back(node);
160171
}
161172
p.push_back(pt);
@@ -180,14 +191,14 @@ void MainWindow::createRandomMap() {
180191
generator.seed(seed);
181192
p.clear();
182193
for (int i = 0; i < row; i++) {
183-
std::vector<algorithm::preNode> pt;
194+
std::vector<algorithm::Node> pt;
184195
for (int j = 0; j < col; j++) {
185196
int k = distribution(generator) < 1;
186-
algorithm::preNode node;
197+
algorithm::Node node(i, j);
187198
if(k) {
188-
node = {"O", -1};
199+
node.val = "O";
189200
} else {
190-
node = {"X", -1};
201+
node.val = "X";
191202
}
192203
pt.push_back(node);
193204
}
@@ -235,6 +246,7 @@ void MainWindow::on_start_btn_clicked()
235246
}
236247
algorithm a(p);
237248
a.setAlgo(algo);
249+
p = a.start();
238250
timer = new QTimer();
239251
reset = false;
240252
connect(timer, SIGNAL(timeout()), this, SLOT(updateMap()));
@@ -249,8 +261,8 @@ void MainWindow::updateMap() {
249261
timer->stop();
250262
reset = false;
251263
}
252-
if (i < step) {
253-
printStep = i;
264+
if (i <= p[x2][y2].g) {
265+
degree = i;
254266
update();
255267
i++;
256268
} else {
@@ -266,8 +278,8 @@ void MainWindow::on_clear_btn_clicked()
266278
if (p.empty()) return;
267279
for (int i = 0; i < p.size(); i++) {
268280
for (int j = 0; j < p[0].size(); j++) {
269-
if (p[i][j] != "E" && p[i][j] != "S" && p[i][j] != "O" && p[i][j] != "X") {
270-
p[i][j] = "X";
281+
if (p[i][j].val != "E" && p[i][j].val != "S" && p[i][j].val != "O" && p[i][j].val != "X") {
282+
p[i][j].val = "X";
271283
}
272284
}
273285
}

mainwindow.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ private slots:
4848
Ui::MainWindow *ui;
4949
int W, M, N;
5050
int x1, x2, y1, y2;
51+
int degree;
5152
bool select_start = false, select_end = false, isPaint = false;
52-
algorithm::printList p;
53-
static int printStep;
53+
algorithm::nodeMap p;
5454
void resizeWindow();
5555
void createRandomMap();
56-
void printRect(int i, int j, QPainter painter, QColor color);
56+
5757
};
5858

5959
#endif // MAINWINDOW_H

maze.cpp

-25
This file was deleted.

maze.h

-33
This file was deleted.

0 commit comments

Comments
 (0)