1. 程式人生 > 實用技巧 >[2020藍橋杯B組決賽] B-擴散

[2020藍橋杯B組決賽] B-擴散

題解

  該題,記憶體消耗是比較大的,因為你要開至少接近 40 M的記憶體空間,但是對於一般機器而言還是撐得住的。

該題單純的 dfs 是很慢的,且容易算錯,所以 bfs 是一個比較好的方法,每隔一分鐘所有點就向外擴充套件一次,然後打個標記,而統計向外擴充套件的次數可以在每個點預設一個值,代表它是第幾次被擴充套件到的,直至 2020 即可。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

typedef long long LL;
const int
N = 10000; LL ans; int maze[N][N]; struct point { int x; int y; int t; }; int row[4] = {-1, 0, 1, 0}, col[4] = {0, 1, 0, -1}; queue <point> q; // 可以用 bfs 來做 int main() { memset(maze, 0, sizeof(maze)); point s; s.x = 2100, s.y = 2100, s.t = 0; q.push(s); s.x = 4120, s.y = 2111
, s.t = 0; q.push(s); s.x = 2111, s.y = 2114, s.t = 0; q.push(s); s.x = 4100, s.y = 4100, s.t = 0; q.push(s); // 染色處理 maze[2100][2100] = true, maze[4120][2111] = true; maze[2111][2114] = true, maze[4100][4100] = true; // 總共操作 2020 次 ans = 4; while (!q.empty()) { point a
= q.front(); q.pop(); for (int i = 0; i < 4; ++i) { s.x = a.x + row[i]; s.y = a.y + col[i]; s.t = a.t + 1; if (!maze[s.x][s.y] && s.t <= 2020) { maze[s.x][s.y] = true; ++ans; q.push(s); } } } cout << ans << endl; return 0; }

  這一題,考場用 dfs 做的,硬是算了好幾分鐘,但還是算錯了,嚶嚶嚶/(ㄒoㄒ)/~~。