c++语言代码需要找bug

代码找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--) 边界设置也有问题,代码已做修改,运行效果如下:

img

#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,导致了错误的判断。

为了解决这个问题,你可以将变量sxzy的初始值设为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;
    }
} 

img

可能是执行第二个条件直接跳出了

我看到的几处明显的错误有:
第四个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)
测试结果如下图

img


代码在下面,只不过提醒一下你这个思路可能会超时,去学习一下bfs做这个题目更简单

采纳一下呦


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