時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
描述小hi被壞女巫抓進裡一間有n x m個格仔組成的矩陣迷宮。
有些格仔是小hi可以經過的,我們用』.』表示;有些格仔上有障礙物小hi不能經過,我們用』#』表示。小hi的起始位置用』s』表示,他需要到達用』t』表示的格仔才能逃離迷宮。
麻煩的是小hi被壞女巫施了魔法,他只能選擇上下左右某乙個方向,沿著這個方向一直走,直到遇到障礙物或者迷宮邊界才能改變方向。新的方向可以是上下左右四個方向之一。之後他還是只能沿著新的方向一直走直到再次遇到障礙物或者迷宮邊界……
小hi想知道他最少改變幾次方向才能逃離這個迷宮。
輸入第一行包含兩個整數n和m。 (1 <= n, m <= 500)
以下n行每行m個字元,代表迷宮。
輸出乙個整數代表答案。如果小hi沒法逃離迷宮,輸出-1。
樣例輸入
5 5
s.#.t
.....
.....
.....
.....
樣例輸出
2
一開始,我想的太複雜了,用bfs逐個掃,乙個乙個格仔走。後來發現**量太大了,寫了半天最後wrong answer。。。於是,一怒之下改了整個程式。下面是主要得思路:
之前我是一步步走,逐個試,如上樣例中,先是(0,0),然後(1,0),(0,1),(2,0),(1,1) ……;後來發現其實不需要,因為在遇到障礙物之前不需要轉彎,索性直接讓它一路走到黑,遇到障礙再做處理好了。如上樣例中,先是(0,0),然後(4,0),(0,1),(4,4),(4,1),(4,0)就到t了。改了程式後,果斷ac,下面是ac**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct node
};int zh[4][2] = ,,, };//轉換方向用的陣列,順序是上左下右
const
int maxn = 510;
char ditu[maxn][maxn];
bool visit[maxn][maxn];//儲存訪問的資訊
queue
duilie;
int m = 0, n = 0;
int walk(node &n,int &flag)//走直線,注意這裡是引用,即會改變原來的值
}if (!flag)
return0;}
int lushi()
//記錄起始位置}}
node st(startx, starty, 0);//初始位置的節點,節點位置和轉向的步數,此時當然為0
for (int i = 0; i < 4; i++)
visit[startx][starty] = true;//初始位置標記訪問
while (!duilie.empty())
else}}
}}
cout
<< "-1"
<< endl;//如果一直沒有找到,說明不可達
return0;}
int main()
演算法導論15 1
動態規劃 dynamic programming 描述了它區別與其他演算法的最大特徵 其中 programming 表示的是一種 法,在動態規劃演算法執行的過程中,會動態地去將子問題的解填入 和讀取已知子問題的解,以減少不必要的運算 相同點 都是通過組合子問題的解來求解原問題 不同點 動態規劃子問題...
1 5 1 泛型總覽
泛型是.net 中重要的一部分。那麼接下來將從一下幾個方面來介紹泛型 1 效能 2 型別安全 3 二進位制 的重用 4 膨脹 5 命名手冊 首先回顧一下值型別和引用型別 值型別是存在棧中的,引用型別是存在堆中的,c 類為引用型別,結構體為值型別。對於.net來說,值型別轉化為引用型別是很容易的。舉個...
Hihocoder 數列問題
給定乙個長度為n數列a a1,a2,an a 1,a 2,a n a1 a2 an 由於某種原因,小ho對這個數列有些不滿意。他希望每個在數列 現的數值,其出現的次數都是唯一的。假設a 1,1,2,2 1和2都出現了2次,小ho就會不滿意。於是小ho決定從a中刪除一些數,使得每個數值出現次數都是唯一...