1. 程式人生 > >101611G God of Winds 思路思路思路 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest

101611G God of Winds 思路思路思路 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest

題意:

給定一個n*m的網格,每跳邊有一個初始值,在一些格子裡填數,會對這個格子的4條邊有影響

問是否存在填數方案使得所有的邊值為0;

思路:

對於每一列格子的橫邊,若是加和為0,那一定存在一種解使得這一列橫邊為0,

對於每一行格子的豎邊,若是加和為0,那一定存在一種解使得這一行豎邊為0,

可以看作一組方程式的行列式

若滿足上述兩個條件,即有解

另一種思路:若有解,即有無數種解,因為某個格子加一,其餘的所有格子的絕對值加一就能保證可行,我們可以先假設第一個格子填一個數0,然後對後面的所有格子填數,最後check可行性

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000 + 7;
int n, m;
int a[maxn/2][maxn];

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m*2; ++j) {
            scanf("%d", &a[i][j]);
        }
    }
    bool ok = true;
    ll sum = 0;
    for(int i = 1; i < 2*m; i += 2) {
        sum = 0;
        for(int j = 1; j <= n; ++j) {
            sum += a[j][i];
        }
        if(sum != 0) {
            ok = false;
            break;
        }
    }
    for(int i = 1; i <= n; ++i) {
        sum = 0;
        for(int j = 2; j <= 2*m; j += 2) {
            sum += a[i][j];
        }
        if(sum != 0) {
            ok = false;
            break;
        }
    }
    if(!ok) {
        puts("No");
    }
    else {
        puts("Yes");
    }
    return 0;
}