题目描述
题目描述:
读入一个 n*m 的 01 矩阵,q 次操作,每次将一个子矩阵内的 01 翻转,求最终的矩阵。
输入格式:
第一行三个整数 n,m,q
之后 n 行每行 m 个整数 0 或 1
之后 q 行,每行四个整数 x1,y1,x2,y2,表示要翻转矩阵的左上角和右下角。
输出格式:
输出一个矩阵表示答案
样例输入1 :
5 4 1
1 1 0 0
1 0 0 0
0 0 1 1
1 1 1 1
1 0 1 0
2 2 5 3
样例输出1 :
1 1 0 0
1 1 1 0
0 1 0 1
1 0 0 1
1 1 0 0
约定:
1 ≤ n,m ≤ 500, q ≤ 1000000
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,q,b[501][501],x,y,xx,yy,c[501][501];
bool a[501][501];
cin>>n>>m>>q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
b[i][j]=0;
}
}for(int i=0;i<q;i++){
cin>>x>>y>>xx>>yy;
x--;y--;
b[x][y]++;b[xx][y]--;
b[x][yy]--;b[xx][yy]++;
}for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0||j==0)c[i][j]=b[i][j];
else c[i][j]=b[i][j]+c[i-1][j]+c[i][j-1]-c[i-1][j-1];
if(c[i][j]%2)a[i][j]=!a[i][j];
cout<<a[i][j]<<" ";
}cout<<"\n";
}return 0;
}