面試筆試演算法 廣搜

2021-10-10 22:34:11 字數 3322 閱讀 7711

用於計算地圖中起點到終點最短步長問題。

廣蒐時,偶爾會有疑惑,為什麼可以在標記地圖上直接標上步數?會不會有別的點廣蒐時步數更小的情況?答案當然是不會的,在初始情況時,一定要把所有初始點塞進佇列中,才能開始廣搜,這樣保證每一輪都穩定地往起始點外擴乙個步長,並且先標記到的格仔中記錄的一定是最短步長。

​ 難得的休息日,小明起床時就已經 11 點多了,他常去的餡餅店一般 12 點就沒飯了,他需要趕緊洗漱,出門,然後去餡餅店吃飯,到了小區大門口他傻眼了,前幾天貼的修路公告成為了現實,現在小區門外已經成為工地,到處都是路障。小區門口到餡餅店的路形如乙個 n×m 的二維矩陣,能走的道路被標記成了 .,路障被標記成了 #,小區大門被標記成了 2,餡餅店被標記成了 3,小明可以在矩陣上上下左右移動,每移動一次代表走了一步,現求小明從小區門口最少走多少步才能到達餡餅店,若無法到達則輸出 −1。

#include

#include

using namespace std;

struct node

;int sx, sy;

char mmap[

505]

[505];

int dir[4]

[2]=

;int

main()

}}queue que;

que.

push

((node));

while

(!que.

empty()

)if(mmap[x]

[y]==

'.'));

//將可用節點壓入佇列}}

} cout <<-1

<< endl;

return0;

}

農民約翰有很多牛,他想交易其中一頭被don稱為騎士的牛。這頭牛有乙個獨一無二的超能力,在農場裡像騎士一樣地跳(就是我們熟悉的象棋中馬的走法)。雖然這頭神奇的牛不能跳到樹上和石頭上,但是它可以在牧場上隨意跳,我們把牧場用乙個 x,y

的座標圖來表示。

​ 這頭神奇的牛像其它牛一樣喜歡吃草,給你一張地圖,上面標註了騎士的開始位置,樹、灌木、石頭以及其它障礙的位置,除此之外還有一捆草。現在你的任務是,確定騎士要想吃到草,至少需要跳多少次。騎士的位置用 k​

來標記,障礙的位置用 ∗​ 來標記,草的位置用 h​

來標記。

#include

#include

using namespace std;

int dir[8]

[2]=

;//int sx, sy;

int n, m;

char mmap[

200]

[200];

struct node

;int

main()

);}}

}while

(!que.

empty()

)if(mmap[x]

[y]==

'.'));

mmap[x]

[y]=

'#';

//!!!注意關鍵}}

} cout <<-1

<< endl;

return0;

}

有乙個 n 行 m 列的棋盤( 1#include

#include

using namespace std;

int dir[8]

[2]=

;int sx, sy;

int n, m;

int mmap[

500]

[500];

struct node

;int

main()

);mmap[sx]

[sy]=-

1;while

(!que.

empty()

));}

}}for(

int i =

1; i <= n; i++

)else

if(mmap[i]

[j]==0)

else

} cout << endl;

}return0;

}年輕的拉爾夫開玩笑地從乙個小鎮上偷走一輛車,但他沒想到的是那車屬於警察局。並且車上裝有用於發射車子移動路線的裝置。那個裝置太舊了,以至於只能發射關於那輛車的移動路線的方向資訊。

​ 通過使用一張小鎮的地圖,幫助警察局找到那車。表示出該車最終所有可能的位置。

​ 小鎮的地圖是矩形的,上面的符號用來標明那兒可以行車和那兒不行。「.」

表示小鎮上那塊地方是可以行車的,符號 「x」 表示此處不能行車。拉爾夫所開小車的初始位置,用字元的 「∗」

,表示,且汽車能從初始位置通過。汽車能向四個方向移動:向北(上),南(下),西(左),東(右);拉爾夫所開小車的行動路線是通過一組給定的方向來描述的,在每個給定的方向,拉爾夫駕駛小車通過小鎮上的乙個或更多的可行車地點。

#include

#include

#include

using namespace std;

int dir[4]

[2]=

;char mmap[

100]

[100];

struct node

;int

main()

);}}

}int k, r;

//string dirc;

cin >> k;

//方向數

for(

int i =

0; i < k; i++

), qsize = que.

size()

;if(dirc ==

"north"

)else

if(dirc ==

"south"

)else

if(dirc ==

"east"

)else

if(dirc ==

"west"

)while

(que.

front()

.step == i)

); check[x]

[y]=1;

}//一定要加check!!!不然通不過一些用例}}

}while

(!que.

empty()

)//輸出地圖

for(

int i =

1; i <= n; i++

) cout << endl;

}return0;

}

面試筆試演算法目錄

尋找缺失的數字 二進位制中1的個數 位運算 檢測乙個數能否被3整除 位運算 判斷兩個數是否符號相反 位運算 數字轉字母的編碼方式的個數 dp 直方圖最大面積 dp 求最長上公升 下降子串行 o nlgn 尋找下乙個較大元素 利用棧 包含min函式的棧 利用棧 中綴表示式轉為字尾表示式 棧 tromi...

面試筆試演算法 euler

todo 大整數減法 除法 int a 1,b 1,c 2 斐波那契遞推 while int func int x return t raw long long ans,zero cnt,now 1 if num i 0 else if num i 13 0 else if zero cnt 0 a...

面試筆試演算法題練習一(列表逆數)

2019年某公司一道筆試題如圖 現在需要注意的問題 1.若人在樓棟中間,最少可以看見3棟樓 兩旁的樓 自身所在樓 若樓層無遮蓋,則可以看見更多。2.若人在兩邊界,則最少可以看見2棟樓 一旁的樓 自身所在樓 若樓層 無遮蓋,則可以看見更多。自己的錯誤思路1 簡單的計算逆數,只算有無遮蓋,忽略了若建築物...