代码找bug;
代码:
#include<bits/stdc++.h>
using namespace std;
int a[32][32];
int main()
{
int n;
int q,w;
bool s=false,x=false,z=false,y=false;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=2;i<n;i++)
{
for(int j=2;j<n;j++)
{
if(a[i][j]==0)
{
q=i;
w=j;
for(int g=1;g<i;g++){if(a[g][j]==1){s=true;break;}}
for(int p=n-1;p>i;p--){if(a[p][j]==1){x=true;break;}}
for(int m=1;m<j;m++){if(a[i][m]==1){z=true;break;}}
for(int o=n-1;o>j;o--){if(a[i][o]==1){y=true;break;}}
if(s==true&&x==true&&z==true&&y==true)
{
a[q][w]=2;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
思路:
枚举a[2n-1][2n-1]的每个点,若这个点为“0”且上下左右都有“1”,则改为2;
比如输入为:
6
0 0 1 1 1 0
1 1 1 0 1 0
1 0 0 0 0 1
1 1 0 1 1 1
0 1 0 1 0 0
0 1 1 1 0 0
输出应为:
0 0 1 1 1 0
1 1 1 2 1 0
1 2 2 2 2 1
1 1 2 1 1 1
0 1 2 1 1 0
0 1 1 1 0 0
我的输出:
0 0 1 1 1 0
1 1 1 2 1 0
1 2 2 2 2 1
1 1 2 1 1 1
0 1 2 1 2 0
0 1 1 1 0 0
为什么这个位置正确输出是1呢?右和下都是0啊。
在24行插入s=x=z=y=false;每次判断这四个标志时,初始应该为false。否则一旦被修改为true,对应标志就永远是true了。
bool s = false, x = false, z = false, y = false;变量初始化位置不对,for (int p = n ; p>i; p--)和 for (int o = n ; o>j; o--) 边界设置也有问题,代码已做修改,运行效果如下:
#include<bits/stdc++.h>
using namespace std;
int a[32][32];
int main()
{
int n;
int q, w;
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
}
for (int i = 2; i<n; i++)
{
for (int j = 2; j<n; j++)
{
bool s = false, x = false, z = false, y = false;
if (a[i][j] == 0)
{
q = i;
w = j;
for (int g = 1; g<i; g++) { if (a[g][j] >= 1) { s = true; break; } }
for (int p = n ; p>i; p--) { if (a[p][j] >= 1) { x = true; break; } }
for (int m = 1; m<j; m++) { if (a[i][m] >= 1) { z = true; break; } }
for (int o = n ; o>j; o--) { if (a[i][o] >= 1) { y = true; break; } }
if (s == true && x == true && z == true && y == true)
{
a[q][w] = 2;
}
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
根据你提供的代码和输入,我发现问题出在对y
变量的判断上。在第二个for循环中,当遍历到j=n-2
时,会执行if(a[i][o]==1){y=true;break;}
这一语句,然后将y
设置为true
。但在下一个循环中,当j=n-1
时,y
仍然保持为true
,导致了错误的判断。
为了解决这个问题,你可以将变量s
、x
、z
和y
的初始值设为false
,并在每次进入内层循环之前将它们重置为false
。这样就能确保每次都从正确的初始状态开始判断。
下面是修改后的代码:
#include<bits/stdc++.h>
using namespace std;
int a[32][32];
int main()
{
int n;
int q,w;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=2;i<n;i++)
{
for(int j=2;j<n;j++)
{
if(a[i][j]==0)
{
bool s=false,x=false,z=false,y=false; // 重置为false
q=i;
w=j;
for(int g=1;g<i;g++){if(a[g][j]==1){s=true;break;}}
for(int p=n-1;p>i;p--){if(a[p][j]==1){x=true;break;}}
for(int m=1;m<j;m++){if(a[i][m]==1){z=true;break;}}
for(int o=n-1;o>j;o--){if(a[i][o]==1){y=true;break;}}
if(s==true&&x==true&&z==true&&y==true)
{
a[q][w]=2;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
现在,代码应该能够正确输出期望的结果了。
直接找的话可能有点麻烦
#include<bits/stdc++.h>
using namespace std;
int a[35][35],n,b[35][35],f;
int fx[4]={-1,0,0,1},fy[4]={0,-1,1,0};
int TP(int x)
{
if(x<0||x==n) return 1;
return 0;
}
inline void dfs1(int x,int y)
{
if(b[x][y]) return;
if(TP(x)||TP(y))
{
f=1;
return;
}
b[x][y]=2;
for(int i=0;i<4;i++)
dfs1(x+fx[i],y+fy[i]);
}
inline void dfs2(int x,int y)
{
if(a[x][y]) return;
a[x][y]=2;
for(int i=0;i<4;i++)
dfs2(x+fx[i],y+fy[i]);
}
int main()
{
int i,j,x,y,flag;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]==0)
{
x=i;
y=j;
}
b[i][j]=a[i][j];
}
for(;;)
{
f=0;
flag=0;
dfs1(x,y);
if(f==0) break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(!b[i][j])
{
x=i;
y=j;
flag=1;
break;
}
if(flag) break;
}
}
dfs2(x,y);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
}
可能是执行第二个条件直接跳出了
我看到的几处明显的错误有:
第四个for循环那里里面,s x y z 每次需要重新赋值为false ,否则当多次循环后,后面的判断逻辑就是错误的,因为假如s为true了,那么下次循环它还是true
还有一处明显的错误,就是循环条件的错误。p=n-1和o=n-1那里,应该都是等于n,而不是n-1
其它的错误你结合下其他人的回答看看或者以及再检查检查
变量初始化位置不对,将变量s、x、z、y的定义改为:bool s = false, x = false, z = false, y = false;
三个错误,第一个是s,x,z,y位置放置不对,第二个是循环的初始值不对,第三个是不能判断是否为1(因为赋值为2其实也应该看着为1)
测试结果如下图
采纳一下呦
#include<bits/stdc++.h>
using namespace std;
int a[32][32];
int main()
{
int n;
int q,w;
bool s=false,x=false,z=false,y=false;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
// 修改循环条件从1到n
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==0)
{
q=i;
w=j;
for(int g=1;g<i;g++){if(a[g][j]==1){s=true;break;}}
for(int p=n-1;p>i;p--){if(a[p][j]==1){x=true;break;}}
for(int m=1;m<j;m++){if(a[i][m]==1){z=true;break;}}
for(int o=n-1;o>j;o--){if(a[i][o]==1){y=true;break;}}
if(s==true&&x==true&&z==true&&y==true)
{
a[q][w]=2;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}