題解 AcWing177 噩夢

2022-07-02 11:36:11 字數 1154 閱讀 4484

題面

考慮雙向廣搜。

我們需要記錄男孩和女孩的當前位置,並且每次都進行擴充套件。

記錄乙個陣列 \(st[i][j]\) 。

如果當前擴充套件的是男孩,且當前的位置是 \((x,y)\) ,那麼當 \(st[x][y]=2\) 時直接返回當前擴充套件的層數即可;

如果當前擴充套件的是女孩,那麼當 \(st[x][y]=1\) 時直接返回就可以了。

題目中有一句話:

在第 \(k\) 秒後所有與鬼的曼哈頓距離不超過 \(2k\) 的位置都會被鬼占領。

我們根據這句話的提示判斷該點是否要擴充套件即可。

其實雙佇列來實現雙向廣搜還是比較易懂的。

#include #define debug fprintf(stderr, "passing [%s] line %d\n", __function__, __line__)

#define itn int

#define gi gi

using namespace std;

inline int gi()

while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return f * x;

}const int maxn = 803;

int t, n, m;

char s[maxn][maxn];

int st[maxn][maxn];

pair boy, girl, ghost[5];

const int dx = , dy = ;

inline bool check(int x, int y, int step)

inline int bfs()

} qb.push(boy); qg.push(girl);

int step = 0; //擴充套件的層數

while (qb.size() || qg.size()) //如果還可以擴充套件

}} for (int i = 1; i <= 1; i+=1) //女孩只要擴充套件一步

}} }

return -1; //無解

}int main()

return 0;

}

AcWing 177 噩夢 雙向BFS

給定一張n m的地圖,地圖中有1個男孩,1個女孩和2個鬼。字元 表示道路,字元 x 表示牆,字元 m 表示男孩的位置,字元 g 表示女孩的位置,字元 z 表示鬼的位置。男孩每秒可以移動3個單位距離,女孩每秒可以移動1個單位距離,男孩和女孩只能朝上下左右四個方向移動。每個鬼佔據的區域每秒可以向四周擴張...

ACwing 天才ACM 題解

題面入口 題目大意,將乙個數列劃分成最少的幾段,滿足每段內的資料集合中,取m對最大最小數出來,將其取出來的每對數求差值並平方,並求這m對的差值平方的求和值s,這個值不能超過指定的t。題目分析 從劃分後的集合中選出m對數,讓每對數的差的平方的和最大值為乙個貪心模型,我們只需要將集合中的元素按從小到大排...

題解 AcWing 1547 約會

原題傳送 acwing 1547.約會 大偵探福爾摩斯接到一張奇怪的字條 我們約會吧!3485djdkxh4hhge 2984akdfkkkkggedsb s hgsfdk d hyscvnm。大偵探很快就明白了,字條上奇怪的亂碼實際上就是約會的時間星期四14 04,因為前面兩字串中第 1 11 對...