Skip to content

Commit 46bc2a4

Browse files
try to rebuild
1 parent ce137ad commit 46bc2a4

File tree

7 files changed

+165
-101
lines changed

7 files changed

+165
-101
lines changed

algorithm.cpp

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "algorithm.h"
22

3-
algorithm::algorithm(std::vector<std::vector<std::string>> &p)
3+
algorithm::algorithm(printList &p)
44
{
55
algo = &distance::manhattan; //select distance algorithm
66
for (int i = 0; i < p.size(); i++) {
@@ -9,14 +9,14 @@ algorithm::algorithm(std::vector<std::vector<std::string>> &p)
99
std::vector<int> st;
1010
st.resize(p[i].size(), 0);
1111
for (int j = 0; j < p[i].size(); j++) {
12-
if (p[i][j] == "E") {
12+
if (p[i][j].val == "E") {
1313
x2 = i;
1414
y2 = j;
15-
} else if (p[i][j] == "S") {
15+
} else if (p[i][j].val == "S") {
1616
x1 = i;
1717
y1 = j;
1818
st[j] = 1;
19-
} else if (p[i][j] == "O") {
19+
} else if (p[i][j].val == "O") {
2020
gt[j] = 1;
2121
}
2222
}
@@ -30,8 +30,8 @@ void algorithm::setAlgo(int (distance::*algo)(int, int, int, int)) {
3030
this->algo = algo;
3131
}
3232

33-
algorithm::list algorithm::start() {
34-
list pList = astar(x1,y1,x2,y2,p,g,s,algo);
33+
algorithm::printList algorithm::start() {
34+
printList pList = astar(x1,y1,x2,y2,p,g,s,algo);
3535
p = pList.back();
3636
return pList;
3737
}
@@ -41,7 +41,7 @@ int algorithm::distance::chebyshev(int i, int j, int x2, int y2) {
4141
}
4242
int algorithm::distance::bfs(int i, int j, int x2, int y2) {
4343
i = j = x2 = y2 = 0;
44-
return 0; //雪比切夫距离
44+
return 0; //BFS
4545
}
4646
int algorithm::distance::euclidean(int i, int j, int x2, int y2) {
4747
return (int) (sqrt((i - x2) * (i - x2) + (j - y2) * (j - y2))); //欧几里德距离
@@ -50,38 +50,38 @@ int algorithm::distance::manhattan(int i, int j, int x2, int y2) {
5050
return abs(i - x2) + abs(j - y2); //曼哈顿距离
5151
}
5252

53-
algorithm::list algorithm::astar(int x1, int y1, int x2, int y2,
54-
std::vector<std::vector<std::string>> &p,
53+
algorithm::printList algorithm::astar(int x1, int y1, int x2, int y2, printList &p,
5554
const std::vector<std::vector<int>> g, std::vector<std::vector<int>> s,
5655
int(distance::*algo)(int, int, int, int)) {
57-
std::vector<std::vector<std::vector<std::string>>> pList;
58-
pList.push_back(p);
56+
5957
if (p.empty() || p[0].empty() || (x1==x2&&y1==y2) ||
6058
x1<0||x2<0||y1<0||y2<0||x1>=p.size()||x2>=p.size()||y1>=p[0].size()||y2>=p[0].size())
61-
return pList;
59+
return p;
6260
int M = p.size();
6361
int N = p[0].size();
6462
distance dis;
63+
// init
6564
int c = 0;
6665
s[x1][y1] = 1;
6766
std::priority_queue<Node> q;
6867
q.push({x1, y1, 0, (dis.*algo)(x1, y1, x2, y2)});
68+
p[x1][y1].g = 0;
6969
bool exit = false;
70+
// astar
7071
while (!q.empty()) {
7172
Node n = q.top();
7273
q.pop();
73-
pList.push_back(p);
7474
for (int i = 0; i < 4; ++i) {
7575
int a = diri[i] + n.i;
7676
int b = dirj[i] + n.j;
7777
if (overflow(a, b, M, N) && s[a][b] != 1 && g[a][b] != 1) {
7878
c++;
7979
s[a][b] = 1;
8080
q.push({a, b, n.g + 1, (dis.*algo)(a, b, x2, y2)});
81-
p[a][b] = dir[i];
81+
p[a][b].val = dir[i];
82+
p[a][b].g = n.g + 1;
8283
if (a == x2 && b == y2) {
8384
print(p,x2,y2);
84-
pList.push_back(p);
8585
std::cout << "ok " << c << " step" << std::endl;
8686
exit = true;
8787
break;
@@ -95,38 +95,38 @@ algorithm::list algorithm::astar(int x1, int y1, int x2, int y2,
9595
if (!exit) {
9696
std::cout << "failed" << std::endl;
9797
}
98-
return pList;
98+
return p;
9999
}
100100

101101
bool algorithm::overflow(int a, int b, int m, int n) {
102102
return a >= 0 && b >= 0 && a < m && b < n;
103103
}
104-
void algorithm::print(std::vector<std::vector<std::string> > &p, int x2, int y2) {
104+
void algorithm::print(printList &p, int x2, int y2) {
105105
int x = x2, y = y2;
106106
int len = 0;
107-
while (p[x][y] != "S") {
108-
if (p[x][y] == dir[0]) {
109-
p[x][y] = "A";
107+
while (p[x][y].val != "S") {
108+
if (p[x][y].val == dir[0]) {
109+
p[x][y].val = "A";
110110
x -= diri[0];
111111
y -= dirj[0];
112112
len++;
113-
} else if (p[x][y] == dir[1]) {
114-
p[x][y] = "A";
113+
} else if (p[x][y].val == dir[1]) {
114+
p[x][y].val = "A";
115115
x -= diri[1];
116116
y -= dirj[1];
117117
len++;
118-
} else if (p[x][y] == dir[2]) {
119-
p[x][y] = "A";
118+
} else if (p[x][y].val == dir[2]) {
119+
p[x][y].val = "A";
120120
x -= diri[2];
121121
y -= dirj[2];
122122
len++;
123-
} else if (p[x][y] == dir[3]) {
124-
p[x][y] = "A";
123+
} else if (p[x][y].val == dir[3]) {
124+
p[x][y].val = "A";
125125
x -= diri[3];
126126
y -= dirj[3];
127127
len++;
128128
}
129129
}
130130
std::cout << "length " << len << std::endl;
131-
p[x2][y2] = "E";
131+
p[x2][y2].val = "E";
132132
}

algorithm.h

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,24 @@
99
class algorithm
1010
{
1111
public:
12-
typedef std::vector<std::vector<std::vector<std::string>>> list;
13-
algorithm(std::vector<std::vector<std::string>> &p);
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+
27+
};
28+
Maze maze;
29+
algorithm(Maze maze);
1430
class distance {
1531
public:
1632
int manhattan(int i, int j, int x2, int y2);
@@ -19,33 +35,22 @@ class algorithm
1935
int bfs(int i, int j, int x2, int y2);
2036
};
2137
void setAlgo(int (algorithm::distance::*algo)(int, int, int, int));
22-
list start();
38+
printList start();
2339
private:
24-
struct Node {
25-
int i, j, g, h;
26-
bool operator<(const Node &a) const {
27-
if ((a.g + a.h) == (g + h)) {
28-
if(a.h == h) {
29-
return a.g < g;
30-
}
31-
return a.h < h;
32-
}
33-
return (a.g + a.h) < (g + h);
34-
}
35-
};
40+
3641

3742
const int diri[4] = {0, 1, 0, -1};
3843
const int dirj[4] = {1, 0, -1, 0};
3944
const char dir[4][4] = {"", "", "", ""};
4045
int x1, x2, y1, y2;
4146
int (distance::*algo)(int, int, int, int) = NULL;
42-
std::vector<std::vector<std::string>> p;
47+
printList p;
4348
std::vector<std::vector<int>> g;
4449
std::vector<std::vector<int>> s;
4550
void print(std::vector<std::vector<std::string> > &p, int x2, int y2);
46-
list astar(int x1, int y1, int x2, int y2,
47-
std::vector<std::vector<std::string>> &p,
48-
const std::vector<std::vector<int>> g, std::vector<std::vector<int>> s,
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,
4954
int(distance::*algo)(int, int, int, int));
5055
bool overflow(int a, int b, int m, int n);
5156
};

graph_algorithm.pro

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ DEFINES += QT_DEPRECATED_WARNINGS
2626
SOURCES += \
2727
main.cpp \
2828
mainwindow.cpp \
29-
algorithm.cpp
29+
algorithm.cpp \
30+
maze.cpp
3031

3132
HEADERS += \
3233
mainwindow.h \
33-
algorithm.h
34+
algorithm.h \
35+
maze.h
3436

3537
FORMS += \
3638
mainwindow.ui

0 commit comments

Comments
 (0)