原题链接:1048. 检测矩阵
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素"的操作定义为0变成1或者1变成0。
输入
输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。
输出
如果矩阵符合条件,则输出OK;
如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。
如果不符合以上两条,输出Corrupt。
样例输入
4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
样例输出
OK
题记:
1.判断每行1的数量是不是偶数,就看每行的和除以2的余数是不是0,列也是如此。
2.判断是否符合条件,就看行和列1的个数是偶数的情况:如果都是偶数,则符合条件;如果行列各有一个是奇数,则改变一个元素可以符合条件;其余情况都是不行的。
3.输出还要注意一下,三种情况需要的输出不同。
ps:先把男票100分的代码拿过来,我写的90分,目前还没找到哪错了,也放在下面了,求大佬指教。
C++程序如下:
(100分)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,j,k;
int num[100][100]={};
int col[100]={},row[100]={},cols=0,rows=0;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>num[i][j];
for(i=0;i<n;i++){
k=0;
for(j=0;j<n;j++)
k+=num[i][j];
row[i]=k%2;
rows+=row[i];
k=0;
for(j=0;j<n;j++)
k+=num[j][i];
col[i]=k%2;
cols+=col[i];
}
if(cols==0&&rows==0)
cout<<"OK"<<endl;
else if(cols == 1&&rows==1){
for(i=0;i<n;i++){
if(col[i]>0) cols=i;
if(row[i]>0) rows=i;
}
cout<<rows+1<<" "<<cols+1<<endl;
}else
cout<<"Corrupt"<<endl;
return 0;
}
(90分)
#include <iostream>
#include <cstring>
using namespace std;
int main(void)
{
int n, i, j, row=0, column=0;
cin >> n;
int a[n][n], sum_row[n], sum_column[n];
for(i=0; i<n; i++){
sum_row[i] = 0;
sum_column[i] = 0;
}
//输入数据,并计算每行每列的和(即1的个数和)
for(i=0; i<n; i++)
for(j=0; j<n; j++){
cin >> a[i][j];
sum_row[i] += a[i][j];
sum_column[j] += a[i][j];
}
//分别计算行、列和为奇数的数量和
for(i=0; i<n; i++){
row += sum_row[i] % 2;
column += sum_column[i] % 2;
}
cout << row << " " << column << endl;
//判断是否符合要求,并输出结果
if(row == 0 && column == 0)
cout << "OK" << endl;
else if(row == 1 && column == 1){
for(i=0; i<n; i++){
if(sum_column[i] > 0)
column = i;
if(sum_row[i] > 0)
row = i;
}
cout << row + 1 << " " << column + 1 << endl;
}
else
cout << "Corrupt" << endl;
return 0;
}