P8050 [ZYOI Round1] Chessboard game/棋盘游戏 题解

· · 题解

考虑将棋盘黑白染色。

0 0
0 0
0 0 0 0
0 0 0 0
0 0 0 0

染成

1 0
0 1
1 0 1 0
0 1 0 1
1 0 1 0

其中 1 代表黑色,0 代表白色。

此时白色格子相邻的格子一定是黑色,黑色格子相邻的格子一定是白色。因此将相邻的两个格子中的数同时加 1 或减 1,这两个格子必定一黑一白。那么每次操作后黑格子之和与白格子之和作差,差值不变。

我们可以求出一开始黑格子之和与白格子之和的差,再求出操作后除未知格外黑格子之和与白格子之和的差,二者相减便是答案。

代码:

#include<bits/stdc++.h>
using namespace std;
int n1,m1,n2,m2,k,x,inf=999999,suma,sumb,sum,flag;
int main(){
    cin>>n1>>m1>>n2>>m2>>k;
    for(int i=1;i<=n1;i++){
        for(int j=1;j<=m1;j++){
            cin>>x;
            if(x==inf){     //若是未知格 
                x=0;        //不计录它的值 
                if((i&1)==(j&1))flag=1;     //记录它的颜色 
            }
            if((i&1)==(j&1)){  //若是黑色格 
                suma+=x;
                sumb++;
            }
            else{       //若是白色格 
                suma-=x;
                sumb--;
            }
        }
    }
    for(int i=n1+1;i<=n1+n2;i++){
        for(int j=1;j<=m2;j++){
            cin>>x;
            if(x==inf){     //同上 
                x=0;
                if((i&1)==(j&1))flag=1;
            }
            if((i&1)==(j&1)){
                suma+=x;
                sumb++;
            }
            else{
                suma-=x;
                sumb--;
            }
        }
    }
    sum=suma-sumb*k;    //sumb 表示黑色格子数与白色格子数之差,乘 k表示黑格子之和与白格子之和的差
    if(flag)sum*=-1;    //根据未知格颜色确定答案 
    cout<<sum;
    return 0;
}

无注释:

#include<bits/stdc++.h>
using namespace std;
int n1,m1,n2,m2,k,x,inf=999999,suma,sumb,sum,flag;
int main(){
    cin>>n1>>m1>>n2>>m2>>k;
    for(int i=1;i<=n1;i++){
        for(int j=1;j<=m1;j++){
            cin>>x;
            if(x==inf){ 
                x=0; 
                if((i&1)==(j&1))flag=1; 
            }
            if((i&1)==(j&1)){ 
                suma+=x; 
                sumb++;
            }
            else{ 
                suma-=x;
                sumb--;
            }
        }
    }
    for(int i=n1+1;i<=n1+n2;i++){
        for(int j=1;j<=m2;j++){
            cin>>x;
            if(x==inf){ 
                x=0;
                if((i&1)==(j&1))flag=1;
            }
            if((i&1)==(j&1)){
                suma+=x;
                sumb++;
            }
            else{
                suma-=x;
                sumb--;
            }
        }
    }
    sum=suma-sumb*k; 
    if(flag)sum*=-1; 
    cout<<sum;
    return 0;
}