最大的收获:没有初始化给每个元素赋初值的数组,一定要看一下是不是都赋成了0
以前一维数组int a[5]={0}就全是0了,不知道是不是二维数组不能这样用,网上都用的memset,可以初始化为0
用法:memset(t, 0, sizeof(t)); memset就是专门初始化数组的,这样就可以全初始化为0了
第一个参数是数组的地址,t,&t,&t[0][0]都可以,还是写t吧
第二个是初始化的值
第三个就是sizeof(t)
以后数组初始化一定要小心,也不麻烦还是写个循环一个一个初始化吧,这道题里值30分
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
int main() {
int n,m;cin>>n>>m;
int arr[n][m];int flag[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>arr[i][j];
flag[i][j]=0;
}
}
//一行三个一样的
for(int j=0;j<m;j++){
if(n>2){
for(int i=0;i<n-2;i++){
if(arr[i][j]==arr[i+1][j]&&arr[i+1][j]==arr[i+2][j]){
flag[i][j]=1;flag[i+1][j]=1;flag[i+2][j]=1;
}
}
}
}
//一列三个一样的
for(int i=0;i<n;i++){
if(m>2){
for(int j=0;j<m-2;j++){
if(arr[i][j]==arr[i][j+1]&&arr[i][j+1]==arr[i][j+2]){
flag[i][j]=1;flag[i][j+1]=1;flag[i][j+2]=1;
}
}
}
}
//修改
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(flag[i][j]==1)arr[i][j]=0;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
//神奇,刚开始加了判断如果n<2不进行列方向的搜索,m<2不进行行方向的搜索,直接break 70分
//删掉break,仍判断是否大于二 60分
//再删除判断 70分
//满分的代码几乎一模一样只不过没有判断没有break
//看满分代码唯一不同的是定义了最大的范围30*30
//想到是不是flag数组初始化有问题,本来刚开始调试的时候flag有等于乱码的数,就设置成flag==1修改
//测试了一个不用改的,发现有一个被修改了
//看了一下flag初始化的结果,发现不是全是0
//就顺手在cin 的二重循环里再赋了一次flag[i][j]=0
//满分