用s表示出發點,用.表示可以走的點,用g表示最後的終點,用#表示牆,不能通過。計算出能不走出迷宮,如果能走出迷宮,就計算出最短路徑。
***用乙個dis二維陣列在dis[x][y]處專門儲存起點到(x,y)的距離。
***先將起點push進佇列,然後將此處的dis設定為0,然後進入迴圈。得到佇列的第乙個元素front,判斷front是不是終點,是終點就返回。不是終點的話,就探索周圍的點,並將可以走的點(是可以走的路,並且還沒有走過),加入到佇列的末尾。加入的點的在dis裡面對應的更新距離(距離就是上乙個點的dis+1)。如此迴圈,最終當讀到末尾的點,退出迴圈。或者是que.size()為0,此時沒有可走的點,表示走不出迷宮,退出迴圈。
1:方向的移動,可以使用乙個4*2的陣列來控制!
2:在dis初始化的時候,可以將裡面初始化成乙個特定的數。
3:queue的使用:
①:queuep; <>裡面預設的是deque
②:p.front(); p.pop(); p.push(); p.back(); p.empty()
***沒有清空佇列的函式
4:pair的使用:
①:pairpair<>裡面有兩個引數
②:傳pair進佇列 que.push(pair(1,2));
③:可以通過first second來訪問裡面的元素
直接貼**:
#include #include using namespace std;
typedef pairp;
#define max_x 100
#define max_y 100
const int inf=10000;
char bg[max_x][max_y];
int dis[max_x][max_y];
int s_x,s_y,e_x,e_y;
int n,m;
int dir[4][2]=,,, };
int bfs()
} queueque;
que.push(p(s_x,s_y));
dis[s_x][s_y]=0;
while(que.size())
} } return inf;//表示的是走不到這個點
}void slove()
else
}int main()
} for(i=1;i<=n;i++)
if('g'==bg[i][j])
} }slove();
return 0;}/*
10 10
#s######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...g#
*/
Icarus 一道有趣的題 走出迷宮
看 的時候突然想起來了以前學李戈老師的 c程式設計高階 裡面的這道題,然後在eclipse裡找了找,翻到了原來寫過的這個 重新又看了一遍。感謝那個時候的自己,注釋加了不少。這算是彼時最初接觸程式設計的我遇到的第一道真正演算法意義上的難題 當時我還沒學資料結構 想了很久想不出來,然後上網搜,倒是搜到不...
POJ 3278 第一道BFS 100題 紀念一下
題目在 這個題目過的還是比較艱難的,主要是因為我沒有一下子用最好的辦法做,很多時候,還是沒有完全區分開什麼時候用bfs,什麼時候用dfs 再做幾個題目慢慢總結吧,不過做了這個題目就有100道題目了,繼續加油呀 fight for offers source code problem 3278 use...
一道bfs廣搜的ACM競賽入門題
農夫知道一頭牛的位置,想要抓住它。農夫和牛都於數軸上 農夫起始位於點 n 0 n 100000 牛位於點 k 0 k 100000 農夫有兩種移動方式 1 從 x移動到 x 1或x 1 每次移動花費一分鐘 2 從 x移動到 2 x 每次移動花費一分鐘 假設牛沒有意識到農夫的行動,站在原地不動。最少要...