要求輸出路徑
給定乙個n*m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。
最初,有乙個人位於左上角(1, 1)處,已知該人每次可以向上、下、左、右任意乙個方向移動乙個位置。
請問,該人從左上角移動至右下角(n, m)處,至少需要移動多少次。
資料保證(1, 1)處和(n, m)處的數字為0,且一定至少存在一條通路。
輸入格式
第一行包含兩個整數n和m。
接下來n行,每行包含m個整數(0或1),表示完整的二維陣列迷宮。
輸出格式
輸出乙個整數,表示從左上角移動至右下角的最少移動次數。
資料範圍
1≤n,m≤100
樣例
輸入樣例:
5 50 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出樣例:
8
演算法 (bfs)
c++ **
版本1 簡練
#include
#include
using
namespace std;
#define x first
#define y second
typedef pair<
int,
int> pii;
const
int n =
107;
int n, m;
int g[n]
[n];
pii q[n * n]
;bool st[n]
[n];
int dist[n]
[n];
void
bfs();
st[0]
[0]=
true
;while
(hh <= tt)
, dy=
;for
(int i =
0; i <
4; i ++);
st[a]
[b]=
true;}
} cout << dist[n -1]
[m -1]
<< endl;
}int
main()
}bfs()
;}
版本2
// 迷宮路徑 bfs + 輸出最短路徑
// g表示圖 d表示距離
// d[0][0] = 0 表示取過這個位置了
// 用乙個pr陣列存前乙個就行了, 路徑
// bfs第一次搜到的才是最短距離, 不然第二次搜到就不是最短距離 就沒必要去處理他了
// 把定義和執行語句分開寫
/* 這裡我犯了個非常嚴重的錯誤,因為x變了,後面還用pre[x][y]就會出錯
while (x || y)
*/#include
using
namespace std;
typedef pair<
int,
int> pii;
const
int n =
110;
int n, m;
int g[n]
[n], d[n]
[n];
// 一般都設為全域性變數, pre[n][n]用來存路徑 因為每個點只**於乙個點
pii pre[n]
[n];
// dfs不用這樣存,每一條都直接輸出,所以空間是0(n)
intbfs()
);int dx[4]
=, dy[4]
=;while
(q.size()
);d[x]
[y]= d[t.first]
[t.second]+1
; q.
push()
;}}}
// 逆序輸出路徑
int x = n -
1, y = m -1;
while
(x || y)
cout <<
0<<
" "<<
0<< endl;
return d[n -1]
[m -1]
;}intmain()
單點時限: 2.0 sec
記憶體限制: 256 mb
一天,sunny 不小心進入了乙個迷宮,不僅很難尋找出路,而且有的地方還有怪物,但是 sunny 有足夠的能力殺死怪物,但是需要一定的時間,但是 sunny 想早一點走出迷宮,所以請你幫助他計算出最少的時間走出迷宮,輸出這個最少時間。
我們規定每走一格需要時間單位 1, 殺死怪物也需要時間 1, 如果不能走到出口,則輸出 impossible. 每次走只能是上下左右 4 個方向。
輸入格式
每次首先 2 個數 n,m (0s **你現在所在的位置。
t 代表迷宮的出口。
#代表牆,你是不能走的。
x 代表怪物。
. 代表路,可以走。
處理到檔案結束。
輸出格式
輸出最少的時間走出迷宮。不能走出輸出 impossible。
樣例
輸入樣例:
4 4s.x.
#..#
..#.
x..t
4 4s.x.
#..#
..#.
x.#t
輸出樣例:
6impossible
演算法
(bfs + 優先佇列)
題意:走迷宮,求最短路徑,上下左右走一格花費1,走到有怪的格仔花費2.
思路:將每一點的座標和由起點到該點的距離存入結構體.c++ **由起點開始,將該點存入優先佇列,以到起點的距離dis為優先順序,每次取出dis最小的,向外擴散。
相當於第一輪得出所有到起點距離為1的點,第二輪得出所有到起點距離為2的點。
注意:對普通的最短路問題,由於每個各自的花費相同,因此每次存入的點優先順序都相同.
故不需要使用優先佇列,但本題存在有無怪物的區別,每次存入的格仔的優先順序可能不同,故使用優先佇列。
#include
#include
#include
using
namespace std;
char maze[
201]
[201];
int sx, sy, tx, ty;
//左右上下4個方向
int dx[4]
=;int dy[4]
=;int m, n;
struct node
;bool
operator
<
(const node & a,
const node & b)
void
bfs();
maze[sx]
[sy]
='#'
; que.
push
(st)
;while
(!que.
empty()
)for
(int i =
0; i <4;
++i);if
(nx >=
0&& nx < n&&ny >=
0&& ny < m&&maze[nx]
[ny]
!='#')}
}printf
("impossible\n");
}int
main()
bfs();
}return0;
}
不同權值的bfs問題
題目鏈結 解題思路 多權bfs可以用優先佇列優化以保證每一步都佇列中取出的每一步都是最優解,但本題飛機和步行兩種方式,先選飛行再選步行可以保證每步採取最優情況。首先分析狀態,可開三維vis陣列,vis x y kepp 表示走到 x,y 座標可以繼續續航keep時間所走的步數,由於降落後便可以是空地...
關於css權值的問題
最近迷上html5,看了一些相關學習資料,現在把css中常見易出錯易混淆的知識總結一下 首先說一下關於css樣式繼承,重疊和特殊性 有的時候我們會為同乙個元素設定不同的css樣式 那麼元素會啟用哪乙個css樣式呢?瀏覽器是根據權值來判斷使用哪種樣式的,權值越高,就使用哪種樣式。下面是權值的規則 標籤...
Python基於遞迴演算法實現的走迷宮問題
什麼是遞迴?簡單地理解就是函式呼叫自身的過程就稱之為遞迴。什麼時候用到遞迴?如果乙個問題可以表示為更小規模的迭代運算,就可以使用遞迴演算法。迷宮問題 乙個由0或1構成的二維陣列中,假設1是可以移動到的點,0是不能程式設計客棧移動到的點,如何從陣列中間乙個值為1的點出發,每一只能朝上下左右四個方向移動...