迷宮問題 牛客第六場 之 貪吃蛇 ,詳解

2021-10-20 06:03:46 字數 1911 閱讀 7396

題目描述

無限增長的貪吃蛇小遊戲:

在乙個n*m的迷宮中,有一條小蛇,地圖中有很多圍牆,猥瑣的出題者用「#」表示,而可以走的路用「.」表示,小蛇他隨機出生在乙個點上,出生點表示為「s」,他想抵達的終點表示為「e」,小蛇有乙個奇怪的能力,他每走一格便會增長一格,即他走了一格後,他的尾巴不會縮回。

小蛇想知道他怎麼到達他想去的地方,請你幫助他。

ps:每格長1公尺,貪吃蛇規定不能撞牆,不能咬自己的身體。

輸入描述:

第一行:輸入n,m;

第二行:輸入s的座標xs,ys,e的座標xe,ye;

後面的n行:

每行輸入m個數,描述每一行的情況。

輸出描述:

輸出乙個數,小蛇到達終點的最短距離(單位:cm),若無法達到,輸出-1

示例1輸入

複製3 3

1 1 3 3

.#..#.…輸出

複製400

示例2輸入

複製5 5

1 1 5 5

…###

.#….#.#.

.#.#.

…#.輸出

複製1400

備註:對於 100% 的資料:1\le n,m\le 1001≤n,m≤100 ,保證起點不是圍牆。

說一下內心的ruoruo的想法~

我還是太菜了

簽完到之後就來看這個題了

那個簽到的竟然錯了4次,該打,pia

這個題是乙個典型的模板題,dfs深搜純純的模板,題的大致意思是說有一條小蛇,從起點到終點,#是障礙物,. 是可以走的,求最短路徑,內心世界很複雜,因為我並不是很熟練

我的思路是把 # 和 . 轉化為 2 和 1,1是通路,2是障礙物,存到乙個陣列裡a[120][120],再加乙個v陣列記錄該點是否經過,0代表未訪問,1代表已訪問

#include

using

namespace std;

int a[

120]

[120];

//1 2-->障礙物

int n,m;

int xs,ys,xe,ye;

int minn=

99999999

;int v[

120]

[120];

//0-->未訪問 1-->訪問

int dx[4]

=;//對x來說的四個方向!

int dy[4]

=;//對y來說的四個方向

void

dfs(

int x,

int y,

int step)

for(

int k=

0;k<

4;k++)}

}int

main()

} v[xs]

[ys]=1

;//初始化為1;

dfs(xs,ys,0)

;//初始step=0

if(minn==

99999999

)printf

("-1");

else

printf

("%d"

,minn*

100)

;return0;

}

我調不過來,那我就在最後解釋一下dx dy陣列叭~

假設初始位置是x, y;

int dx[4]=;//對x來說的四個方向!

int dy[4]=;//對y來說的四個方向

往下走會變成(x+1,y);對應1,0

往左走會變成(x,y-1);對應0,-1

往上走會變成(x-1,y);對應-1,0

往右走會變成(x,y+1);對應0,1;

牛客多校第六場

d 題意感覺說的不是很清楚,一開始題意弄錯了,以為是最優的方案,結果是對於每個盒子這個 so clever 的人的做法是優先選擇盡可能大的物品裝完乙個盒子,我就不知道這個人 聰明了。思路 賽後知道題意後,5分鐘寫完,瞎暴力就一發過了,我自己都有點出乎意料真水了。includeusing namesp...

2019牛客多校第六場C(PAM)

傳送門 不會pam,建議看一下該部落格pam 維護乙個陣列,表示節點對於答案的貢獻 那麼如何計算這個值呢,首先我們需要知道它是由誰轉移而來的,比如該節點表示的是aabbbbaa,他是由abbbba轉移而來的,我們在計算aabbbbaa時首先要加上abbbba,然後還有一些fail邊連向的點首先我們來...

2020牛客多校第六場 K

題意 判斷給的序列是不是 任意1 n的全排拼接成序列的連續子串行 每乙個數字應該屬於的地方它只能出現一次。從任意點i開始,如果某個點在往後查詢的時候出現了兩次,那麼i點最多能夠延伸到那個地方。然後我們可以把每個點求一下最多能延伸到哪個點,直接記錄len。操作看 處理 由於k很大,可以到1e9,但是n...