[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ㄒ)/~~。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM