題面
考慮雙向廣搜。
我們需要記錄男孩和女孩的當前位置,並且每次都進行擴充套件。
記錄乙個陣列 \(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 對...