5 |
6 | //该文件是本工程的核心文件,用于构建初始地铁线路图等
7 |
8 | MainWindow::MainWindow(QWidget *parent)
9 | : QMainWindow(parent)
10 | , ui(new Ui::MainWindow)
11 | {
12 | //构造函数,首先显示布局
13 | ui->setupUi(this);
14 |
15 | this->setWindowTitle("1852979_02_Shanghaisubway");
16 | this->setWindowFlags(Qt::WindowCloseButtonHint|Qt::WindowMinimizeButtonHint);
17 | this->setFixedSize(this->width(), this->height());
18 |
19 | //首先定义出17条地铁线
20 | for(int i=0;i<17;i++){
21 | subway_ haha;
22 | sbs.push_back(haha);
23 | }
24 |
25 | //定义文本流文件,开始从subway_data.txt中读取地铁信息
26 | std::fstream fp;
27 | //打开文件
28 | fp.open("subway_data.txt");
29 | if (!fp.is_open()) {
30 | exit(-1);
31 | }
32 |
33 | std::string temp;
34 | int a, b, subway;
35 | station* sp;
36 | int lp;
37 | int ssp;
38 |
39 | //依次构建17条地铁线
40 | for (int uhi = 0; uhi < 17; uhi++) {
41 |
42 | //首先读入地铁列号
43 | fp >> subway;
44 | //保证首站没有上一站
45 | lp = -1;
46 | sbs[uhi].id=subway;
47 |
48 | for (;;) {
49 | //读入站点名
50 | fp >> temp;
51 | //当读到终止符时完成当前地铁线的读入
52 | if (temp == "#") {
53 | break;
54 | }
55 | //读入站点坐标
56 | fp >> a >> b;
57 |
58 | //判断当前站点是否已经在已知站点库中
59 | if ((ssp = is_in(temp)) == -1) {
60 | //如果不在则新建一个站点
61 | sp = new station(temp);
62 | sp->id = id_num++;
63 | sp->addr=QPoint(a*0.75,b*0.75);
64 |
65 | //如果当前站点的经过路线中没有当前讨论的地铁线,则压入
66 | if (!way_is_in(*sp, subway)) {
67 | sp->lines.push_back(subway);
68 | }
69 |
70 | //如果存在上一站,则将上一站与这一站连接起来
71 | if (lp != -1) {
72 | if (!sta_is_in(stations[lp], sp->id)) {
73 | stations[lp].links.push_back(sp->id);
74 | }
75 | if (!sta_is_in(*sp, lp)) {
76 | sp->links.push_back(lp);
77 | }
78 | }
79 |
80 | //当前站记录位上一站
81 | lp = sp->id;
82 |
83 | //压入所有地铁站的容器
84 | stations.push_back(*sp);
85 |
86 | //释放空间
87 | delete sp;
88 | }
89 | else {
90 | //如果已有该站,则对已存在的站点进行操作
91 |
92 | //判断该站点是否已记录经过改路线地铁,没有则压入栈
93 | if (!way_is_in(stations[ssp], subway)) {
94 | stations[ssp].lines.push_back(subway);
95 | }
96 |
97 | //如果存在上一站,则将上一站与这一站连接起来
98 | if (lp != -1) {
99 | if (!sta_is_in(stations[lp], ssp)) {
100 | stations[lp].links.push_back(ssp);
101 | }
102 | if (!sta_is_in(stations[ssp], lp)) {
103 | stations[ssp].links.push_back(lp);
104 | }
105 | }
106 | //当前站记录为上一站
107 | lp = ssp;
108 | }
109 | sbs[uhi].sts.push_back(lp);
110 | }
111 | }
112 | }
113 |
114 | MainWindow::~MainWindow()
115 | {
116 | delete ui;
117 | }
118 |
119 | //该函数用于输出换乘路线
120 | void MainWindow::out_path(path pth) {
121 | int temp = pth.times;
122 | QString qs;
123 |
124 | for (int i = 0; i < temp; i++) {
125 | //换行
126 | if (i != 0) {
127 | qs+="";
128 | qs+="->";
129 | qs+="
";
130 | }
131 | //输出该站点的名称
132 | qs+=""+QString::fromLocal8Bit((stations[pth.ids[i]].name).data());
133 | qs+="...........";
134 |
135 | //输出该站点被经过的所有地铁线
136 | for(int j=0;j";
140 | }
141 |
142 | //输出展示
143 | ui->t_out->setMarkdown(qs);
144 | }
145 |
146 | //定义Qt绘画时间,随生命周期调用,用于绘制外框、地铁线路图、最优换乘路径
147 | void MainWindow::paintEvent(QPaintEvent *)
148 | {
149 | //定义画笔QPainter
150 | QPainter painter(this);
151 | painter.setPen(QPen(Qt::black,4));
152 | painter.drawRect(20,20,1460,1460);
153 |
154 | //首先绘制所有的地铁路线,根据列车编号绘制颜色
155 | for(int i=0;it_start->toPlainText();
242 | QString qs2=ui->t_end->toPlainText();
243 |
244 | if(get_id(qs)==-1||get_id(qs2)==-1){
245 | error* sp=new error;
246 | sp->show();
247 | if(get_id(qs)==-1){
248 | ui->t_start->setMarkdown("");
249 | }
250 | if(get_id(qs2)==-1){
251 | ui->t_end->setMarkdown("");
252 | }
253 | return;
254 | }
255 |
256 | //调用优化后的宽度优先搜索算法进行查找
257 | path ans=search(get_id(qs),get_id(qs2));
258 |
259 | draw_it=ans;
260 | out_path(ans);
261 |
262 |
263 | //更新绘制
264 | update();
265 | }
266 |
267 | void MainWindow::on_pushButton_2_released()
268 | {
269 | add_sta *sp= new add_sta(nullptr,&stations,&id_num);
270 | sp->show();
271 | }
272 |
273 | void MainWindow::on_pushButton_3_released()
274 | {
275 | add_way *wp=new add_way(nullptr,&stations,&sbs);
276 | wp->show();
277 | }
278 |
--------------------------------------------------------------------------------
/1850009_一二三_计算机科学与技术_源代码/02_subway/mainwindow.h:
--------------------------------------------------------------------------------
1 | #ifndef MAINWINDOW_H
2 | #define MAINWINDOW_H
3 |
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include "station.h"
12 | #include "add_sta.h"
13 | #include "add_way.h"
14 |
15 | QT_BEGIN_NAMESPACE
16 | namespace Ui { class MainWindow; }
17 | QT_END_NAMESPACE
18 |
19 | class MainWindow : public QMainWindow
20 | {
21 | Q_OBJECT
22 |
23 | public:
24 | QVector stations;
25 | QVector sbs;
26 |
27 | path draw_it;
28 |
29 | int id_num = 0;
30 |
31 | MainWindow(QWidget *parent = nullptr);
32 | ~MainWindow();
33 |
34 | int is_in(std::string sp) {
35 | size_t uhi = stations.size();
36 | for (size_t i = 0; i < uhi; i++) {
37 | if (sp == stations[i].name) {
38 | return i;
39 | }
40 | }
41 | return -1;
42 | }
43 |
44 | bool way_is_in(station sp, int subway) {
45 | for (size_t i = 0; i < sp.lines.size(); i++) {
46 | if (subway == sp.lines[i]) {
47 | return true;
48 | }
49 | }
50 | return false;
51 | }
52 |
53 | bool sta_is_in(station sp, int sta_id) {
54 | for (size_t i = 0; i < sp.links.size(); i++) {
55 | if (sta_id == sp.links[i]) {
56 | return true;
57 | }
58 | }
59 | return false;
60 | }
61 |
62 | int get_id(QString sp) {
63 | size_t temp = stations.size();
64 | for (size_t i = 0; i < temp; i++) {
65 | if (sp == QString::fromLocal8Bit((stations[i].name).data())) {
66 | return i;
67 | }
68 | }
69 | return -1;
70 | }
71 |
72 | bool is_in_path(int id, path pth) {
73 | for (int i = 0; i < pth.times; i++) {
74 | if (id == pth.ids[i]) {
75 | return true;
76 | }
77 | }
78 | return false;
79 | }
80 |
81 |
82 | void out_path(path pth);
83 |
84 | path search(int start, int end) {
85 | QVector vec;
86 | path orig;
87 | orig.ids.push_back(start);
88 | orig.names.push_back(stations[start].name);
89 | orig.times = 1;
90 | vec.push_back(orig);
91 |
92 | path temp, tw;
93 | int num, bios, uhi;
94 |
95 | for (;;) {
96 | temp = vec[0];
97 |
98 | num = temp.ids[temp.ids.size() - 1];
99 | bios = stations[num].links.size();
100 |
101 | for (int i = 0; i < bios; i++) {
102 | uhi = stations[num].links[i];
103 | tw = temp;
104 | if (uhi == end) {
105 | tw.ids.push_back(uhi);
106 | tw.names.push_back(stations[uhi].name);
107 | tw.times++;
108 | return tw;
109 | }
110 | if (!is_in_path(uhi, tw)) {
111 | tw.ids.push_back(uhi);
112 | tw.names.push_back(stations[uhi].name);
113 | tw.times++;
114 | for (;;) {
115 | if (uhi == end) {
116 | return tw;
117 | }
118 | if (stations[uhi].links.size() == 2) {
119 | if (stations[uhi].links[0] != tw.ids[tw.ids.size() - 2]) {
120 | uhi = stations[uhi].links[0];
121 | tw.ids.push_back(uhi);
122 | tw.names.push_back(stations[uhi].name);
123 | tw.times++;
124 | }
125 | else if (stations[uhi].links[1] != tw.ids[tw.ids.size() - 2]) {
126 | uhi = stations[uhi].links[1];
127 | tw.ids.push_back(uhi);
128 | tw.names.push_back(stations[uhi].name);
129 | tw.times++;
130 | }
131 | }
132 | else if (stations[uhi].links.size() == 1) {
133 | break;
134 | }
135 | else {
136 | vec.push_back(tw);
137 | break;
138 | }
139 | }
140 | }
141 | }
142 |
143 | vec.erase(vec.begin());
144 | }
145 | }
146 |
147 |
148 | private:
149 | Ui::MainWindow *ui;
150 |
151 | protected:
152 | void paintEvent(QPaintEvent *);
153 | private slots:
154 | void on_pushButton_released();
155 | void on_pushButton_2_released();
156 | void on_pushButton_3_released();
157 | };
158 |
159 | #endif // MAINWINDOW_H
160 |
--------------------------------------------------------------------------------
/1850009_一二三_计算机科学与技术_源代码/02_subway/mainwindow.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | MainWindow
4 |
5 |
6 |
7 | 0
8 | 0
9 | 2000
10 | 1500
11 |
12 |
13 |
14 | MainWindow
15 |
16 |
17 |
18 |
19 |
20 | 1535
21 | 60
22 | 150
23 | 40
24 |
25 |
26 |
27 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
28 | <html><head><meta name="qrichtext" content="1" /><style type="text/css">
29 | p, li { white-space: pre-wrap; }
30 | </style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;">
31 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">出发站点:</p></body></html>
32 |
33 |
34 |
35 |
36 |
37 | 1535
38 | 150
39 | 150
40 | 40
41 |
42 |
43 |
44 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
45 | <html><head><meta name="qrichtext" content="1" /><style type="text/css">
46 | p, li { white-space: pre-wrap; }
47 | </style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;">
48 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">目的站点:</p></body></html>
49 |
50 |
51 |
52 |
53 |
54 | 1750
55 | 60
56 | 150
57 | 40
58 |
59 |
60 |
61 |
62 |
63 |
64 | 1750
65 | 150
66 | 150
67 | 40
68 |
69 |
70 |
71 |
72 |
73 |
74 | 1630
75 | 230
76 | 171
77 | 41
78 |
79 |
80 |
81 | 开始规划路径
82 |
83 |
84 |
85 |
86 |
87 | 1535
88 | 300
89 | 365
90 | 881
91 |
92 |
93 |
94 |
95 |
96 |
97 | 1580
98 | 1230
99 | 281
100 | 71
101 |
102 |
103 |
104 | 添加站点
105 |
106 |
107 |
108 |
109 |
110 | 1580
111 | 1340
112 | 281
113 | 71
114 |
115 |
116 |
117 | 添加轨道线
118 |
119 |
120 |
121 |
131 |
132 |
133 |
134 |
135 |
136 |
--------------------------------------------------------------------------------
/1850009_一二三_计算机科学与技术_源代码/02_subway/station.h:
--------------------------------------------------------------------------------
1 | #ifndef STATION_H
2 | #define STATION_H
3 |
4 | #include
5 | #include
6 |
7 | class station {
8 | public:
9 | std::string name;
10 | QVector lines;
11 | QVector links;
12 | QPoint addr;
13 | int id = -1;
14 | station(std::string name) {
15 | this->name = name;
16 | }
17 | };
18 |
19 | class path {
20 | public:
21 | QVector ids;
22 | QVector names;
23 | int times = 0;
24 | };
25 |
26 | class subway_{
27 | public:
28 | int id;
29 | QVector sts;
30 | };
31 |
32 | #endif // STATION_H
33 |
--------------------------------------------------------------------------------
/1850009_一二三_计算机科学与技术_设计说明书.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/trigady/Array-sorting-display-and-Shanghai-Metro-Line-Planning/99fd27edf708443bf0e87304a951c1966f075276/1850009_一二三_计算机科学与技术_设计说明书.doc
--------------------------------------------------------------------------------
/readme.txt:
--------------------------------------------------------------------------------
1 | 本人选择的是(09 排序+02地铁)的组合
2 |
3 | 2021.1.12
4 | 根据jgdl的建议,新增了release,已将可执行程序上传。
5 |
--------------------------------------------------------------------------------
/《数据结构》课程设计计划及题目2020—给学生件.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/trigady/Array-sorting-display-and-Shanghai-Metro-Line-Planning/99fd27edf708443bf0e87304a951c1966f075276/《数据结构》课程设计计划及题目2020—给学生件.doc
--------------------------------------------------------------------------------