From d20dac25dd42a618bf0f574154d2a870432a9501 Mon Sep 17 00:00:00 2001 From: RPG <41836383+HELLORPG@users.noreply.github.com> Date: Thu, 11 Oct 2018 22:33:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\345\210\227\350\247\243\346\263\225.cpp" | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git "a/\346\234\200\347\237\255\350\267\257\345\276\204\351\230\237\345\210\227\350\247\243\346\263\225.cpp" "b/\346\234\200\347\237\255\350\267\257\345\276\204\351\230\237\345\210\227\350\247\243\346\263\225.cpp" index 4c9a2fc..5e5643c 100644 --- "a/\346\234\200\347\237\255\350\267\257\345\276\204\351\230\237\345\210\227\350\247\243\346\263\225.cpp" +++ "b/\346\234\200\347\237\255\350\267\257\345\276\204\351\230\237\345\210\227\350\247\243\346\263\225.cpp" @@ -1,3 +1,39 @@ +/* +题目描述: +小张同学来到南大一年多,对南大各个建筑的位置已经了如指掌。现在他想知道,从他所在的位置去指定教室的最短路径有多长。设计算法帮助小张解决这个问题,要求使用队列。 + + +输入: +第一行为两个整数n和m,表示学校地图的长和宽。 +接下来n行,每行有m个字符,’o’表示可以到达的地方,’x’表示不能到达的地方,’z’表示小张所处位置,’d’表示小张要去的教室。 各字符之间有空格。 + + +输出: +一个整数,表示小张去指定教室的最短路径长度。如果没有路径可以到达则输出-1。 + + +样例输入: +5 5 +o o o o o +o o o o o +o o x d o +o o z x o +o o o o o + +4 6 +x x x x o o +x o x x o x +d o o x z x +o x o o x x + +样例输出: +6 + +-1 +*/ + + + #include #include @@ -40,12 +76,12 @@ int main() char input; cin >> input; map[i][j].data = input; - map[i][j].flag = true;//trueûз + map[i][j].flag = true;//true代表没有访问 } } - //еĵͼʶ - //ջʵ֣ʹ㷨еĻõķǹ㷨 - //㷨² + //输入所有的地图标识 + //如若是栈实现,可以使用深度优先算法,而队列的话,最好的方法是广度优先算法 + //广度优先算法,类似于树的向下查找 FindTheWay *FINDHEAD = new FindTheWay{ -1,-1,-1,nullptr }; Distance *DISHEAD = new Distance{ -1,nullptr }; cout << FindWay(FINDHEAD, DISHEAD, map, n, m) << endl; @@ -79,13 +115,13 @@ int FindWay(FindTheWay* FINDHEAD, Distance* DISHEAD, Map** map, int n, int m) map[begin_row][begin_col].flag = false; FindTheWay *begin = new FindTheWay{ begin_row, begin_col, 0, nullptr }; - FINDHEAD->next = begin;//ṩ˵һڵ㣬ڷͨʽм + FINDHEAD->next = begin;//提供了第一个节点,不便于放在通式里面进行计算 findtail = begin; - FINDHEAD = begin;//ʱͷβͬһλ + FINDHEAD = begin;//此时的头和尾都是同一个位置 while (!Empty(FINDHEAD)) { - if (FINDHEAD->col == end_col && FINDHEAD->row == end_row)//ʱǵյ + if (FINDHEAD->col == end_col && FINDHEAD->row == end_row)//此时是到达了终点 { Distance *dis_p = new Distance{ FINDHEAD->distance, nullptr }; //cout << "dis_p"<next; delete findkill; } - //ûеյ㣬ӦñΧ + //如果没有到达终点,就应该遍历周围的所有 else { - map[FINDHEAD->row][FINDHEAD->col].flag = false;//һλѾ + map[FINDHEAD->row][FINDHEAD->col].flag = false;//标记这一位已经遍历 if (FINDHEAD->row - 1 >= 0 && map[FINDHEAD->row - 1][FINDHEAD->col].flag) { FindTheWay *find_p = new FindTheWay{ FINDHEAD->row - 1, FINDHEAD->col, FINDHEAD->distance + 1,nullptr }; @@ -154,5 +190,5 @@ bool Empty(FindTheWay* HEAD) bool flag(false); (HEAD == nullptr) ? (flag = true) : (flag = false); return flag; -} +}