那个大佬能帮我看下为什么我没法填充第一行以外的其它行

P1319 压缩技术

fengfenglong @ 2022-09-14 13:32:38

#include <iomanip>
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <string>
#include <cstring>
using namespace std;
//#define PI 3.1415926
int a[500][500];
int main()
{
int N,X,jishu = 0,q = 0,flag = 1,hang = 1,lie = 1,tuichu = 0;
cin >> N; 
while(cin >> X)
{
    if(flag%2 == 0)
    {
        q = 1;
        flag ++;
    }
    else
    {
        q = 0;
        flag ++;
    }//判断输入是1还是0;
    for(int i = hang;i <= N;i++)
    {   
        for(int j = lie;j <= N;j++)
        {   
            a[i][j] = q;
            cout <<hang<<' '<< i <<' ' <<j<<' '<<q<<endl;
            lie += 1;
            jishu++;
            if(j == N) hang++;
            if(jishu == X)
            {
                if(lie == N+1)
                {
                    lie = 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
                else
                {
                    lie = j + 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
            }
        }
        if(tuichu == 1)
        {
        tuichu = 0;
        break;
        }
        else
        {
        hang++;
        }

    }//填充1和0
}
for(int i = 1;i <= N;i++)
{
    for(int j = 1;j <= N;j++)
    {
        cout << a[i][j];
    }
    cout << endl;
}//输出结果
return 0;
}

by fengfenglong @ 2022-09-14 13:40:48

这是我修改之后的代码可以显示前几行了但后几行还是显示不出来


#include <iomanip>
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <string>
#include <cstring>
using namespace std;
//#define PI 3.1415926
int a[500][500];
int main()
{
int N,X,jishu = 0,q = 0,flag = 1,hang = 1,lie = 1,tuichu = 0;
cin >> N; 
while(cin >> X)
{
    if(flag%2 == 0)
    {
        q = 1;
        flag ++;
    }
    else
    {
        q = 0;
        flag ++;
    }//判断输入是1还是0;
    for(int i = hang;i <= N;i++)
    {   
        for(int j = lie;j <= N;j++)
        {   
            a[i][j] = q;
            cout << X <<' '<<hang<<' '<< i <<' ' <<j<<' '<<q<<endl;
            lie += 1;
            jishu++;
            if(j == N) 
            {hang++;
             lie = 1;
            }
            if(jishu == X)
            {
                if(lie == N+1)
                {
                    lie = 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
                else
                {
                    lie = j + 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
            }
        }
        if(tuichu == 1)
        {
        tuichu = 0;
        break;
        }

    }//填充1和0
}
for(int i = 1;i <= N;i++)
{
    for(int j = 1;j <= N;j++)
    {
        cout << a[i][j];
    }
    cout << endl;
}//输出结果
return 0;
}

by xqqQwQ_ @ 2022-09-14 13:41:14

稍等,我看一下。


by xqqQwQ_ @ 2022-09-14 13:57:10

@fengfenglong

好的,找到问题了

注意您代码的第49行。

这里是有问题的,如果j正好等于N,那么您会先把lie的值改为1,那么在这里的时候您这句lie=j+1就会把lie的值改为j+1,因为j=n,所以lie的值就变成了n+1,这是不可能的。

解决方法也不难,就是判断那里j是否等于N即可。


by fengfenglong @ 2022-09-14 13:57:22

@LiMLE 我在第一个行的for循环里面到输入到“4”这个数字后程序就突然跑飞了,不正常运行了,我在hang的循环里面输出"hang",跑着跑着乱码了


#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <string>
#include <cstring>
using namespace std;
//#define PI 3.1415926
int a[500][500];
int main()
{
int N,X,jishu = 0,q = 0,flag = 1,hang = 1,lie = 1,tuichu = 0;
cin >> N; 
while(cin >> X)
{
    if(flag%2 == 0)
    {
        q = 1;
        flag ++;
    }
    else
    {
        q = 0;
        flag ++;
    }//判断输入是1还是0;
    for(int i = hang;i <= N;i++)
    {   
        cout << hang <<' ';
        for(int j = lie;j <= N;j++)
        {   
            a[i][j] = q;
            cout << X <<' '<<hang<<' '<< i <<' ' <<j<<' '<<q<<endl;
            lie += 1;
            jishu++;
            if(j == N) 
            {hang++;
            lie = 1;
            }
            if(jishu == X)
            {
                if(lie == N + 1)
                {
                    lie = 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
                else
                {
                    lie = j + 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
            }
        }
        if(tuichu == 1)
        {
        tuichu = 0;
        break;
        }

    }//填充1和0
}
for(int i = 1;i <= N;i++)
{
    for(int j = 1;j <= N;j++)
    {
        cout << a[i][j];
    }
    cout << endl;
}//输出结果
return 0;
}

by xqqQwQ_ @ 2022-09-14 13:58:02

#include <iomanip>
#include <stdio.h>
#include <bits/stdc++.h>
#include <math.h>
#include <string>
#include <cstring>
using namespace std;
//#define PI 3.1415926
int a[500][500];
int main()
{
int N,X,jishu = 0,q = 0,flag = 1,hang = 1,lie = 1,tuichu = 0;
cin >> N; 
while(cin >> X)
{
    if(flag%2 == 0)
    {
        q = 1;
        flag ++;
    }
    else
    {
        q = 0;
        flag ++;
    }//判断输入是1还是0;
    for(int i = hang;i <= N;i++)
    {   
        for(int j = lie;j <= N;j++)
        {   
            a[i][j] = q;
            cout << X <<' '<<hang<<' '<< i <<' ' <<j<<' '<<q<<endl;
            lie += 1;
            jishu++;
            if(j == N) 
            {hang++;
             lie = 1;
            }
            if(jishu == X)
            {
                if(lie == N+1)
                {
                    lie = 1;
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
                else
                {
                    if(j==N) lie=1;
                    else lie=j+1;  //注意这两行。 
                    tuichu = 1;
                    jishu = 0;
                    break;
                }
            }
        }
        if(tuichu == 1)
        {
        tuichu = 0;
        break;
        }

    }//填充1和0
}
for(int i = 1;i <= N;i++)
{
    for(int j = 1;j <= N;j++)
    {
        cout << a[i][j];
    }
    cout << endl;
}//输出结果
return 0;
}

这是改完之后的code


by xqqQwQ_ @ 2022-09-14 13:59:05

@fengfenglong

是的,输入4之后您的程序中的lie就会刚好变成N+1,超出了边界,这会带来不可预知的错误。


by fengfenglong @ 2022-09-14 14:14:13

@LiMLE 这样可以得到示列正确的结果了,但大佬你加的这句我想表达意思就是在40行中括号内想表达的意思,为什么我的不行呢?我把括号改为lie == N依然得不到正确结果,但我在32行中已经表示了lie随j一起变化,为什么lie写在if括号中就不能当作了判断条件,而只能写j?


by xqqQwQ_ @ 2022-09-14 14:17:06

@fengfenglong

因为您之前写了一个if:

if(j == N){
    hang++;
    lie = 1;
}

这一句话会在j=N时把lie改成1.

这样如果在J=N是刚好走完的话。lie就不是跟着j一起了,而是变成了1.

可能我讲的不是很清楚,但是您可以感性理解一下。


by fengfenglong @ 2022-09-14 14:20:05

@LiMLE 谢谢,确实没有注意到,还需要多学习。


by huihui_qwq @ 2022-09-14 15:39:40

@fengfenglong 您的头文件不用写那么多,bits/stdc++.h已经包含了所有头文件了。


|