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;
}