BFS, 30 pts 求条
查看原帖
BFS, 30 pts 求条
1120498
NewbieZZZ楼主2024/10/20 12:14
#include <bits/stdc++.h>
using ll = long long;
using namespace std;

const ll dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
ll a[4030][3030], now[4030][3030];// now_{x,y} 为树的种植时间
ll n, m, q, r, k;

bool check(ll x, ll y) {
    return x > 0 && x <= n && y > 0 && y <= m;
}

bool grow_tree(ll x, ll y){
    bool flag = 0, flag2 = 0;
    for(int D=0; D<4; ++D){
        int nx = x + dx[D], ny = y + dy[D];
        if(check(nx, ny)){
            if(a[nx][ny] == -1){
                flag = 1;
            } if(a[nx][ny] > 0){
                flag2 = 1;
            }
        }
        if(flag && flag2){
        	break;
		}
    }
    return flag && flag2;
}

int main(){
    cin >> n >> m >> q >> r >> k;
    for(int i=1; i<=q; ++i){
        int a1, b1, a2, b2;
        cin >> a1 >> b1 >> a2 >> b2;
        for(int j=a1; j<=a2; ++j){
            for(int p=b1; p<=b2; ++p){
                a[j][p] = -1;
            }
        }
    }
    
    queue<pair<ll, pair<ll, ll>>> Q;
    for(int i=1; i<=r; ++i){
        ll t, x, y;
        cin >> t >> x >> y;
        a[x][y] = 1;
        now[x][y] = t;
        Q.push({t, {x, y}});
    }
    
	while(Q.size()){
        auto cur = Q.front();
        Q.pop();
        ll t = cur.first, x = cur.second.first, y = cur.second.second;
        for(int d=0; d<4 && q; ++d){
            ll xx = x + dx[d], yy = y + dy[d];
            if(check(xx, yy) && a[xx][yy] == 0){
                if(grow_tree(xx, yy)){
                    a[xx][yy] = 1;
                    now[xx][yy] = t + 1;
                    Q.push(make_pair(t+1, make_pair(xx, yy)));
                }
            }
        }
    }
    
    ll cnt = 0;
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j){
			if(a[i][j] > 0 && now[i][j]){
                bool flag = 1;
                for(int d=0; d<4; ++d){
                    ll xx = i + dx[d], yy = j + dy[d];
                    if(check(xx, yy) && a[xx][yy] == 1 && now[xx][yy] <= now[i][j] + k){
                        flag = 0;
                        break;
                    }
                }
                if(flag){
                    continue;
                }
                cnt ++;
            }
        }
    }
    cout << cnt;
    return 0;
}
2024/10/20 12:14
加载中...