求助!

P1319 压缩技术

gat_Coding @ 2024-07-14 22:24:21

0分,问题代码如下

#include <iostream>
using namespace std;
int main()
{
    int n,a[2000],i,i2,i3=0,i4=0,s,bl=0;
    cin>>n;
    for(i=0;i<n*n;i+=a[i])
    {    
        cin>>a[i];
        i4++;               //样例中此处i4=14
    }
    for(i=0;i<i4;i++)       //此处问题一
    {
        for(i2=0;i2<a[i];i2++)
        {
            cout<<bl;
            i3++;
            if(i3==n)
            {     
                cout<<endl;//此处问题二
                i3=0;
            }
        }
        if(bl==0)
            bl=1;
        else
            bl=0;
    }
    return 0;
}

问题一:为什么整个for循环都只有一个i++,却不能循环14次?(只有不到8次)
问题二:为什么换行之后退出了循环,不继续打印?


by jcf666 @ 2024-07-14 23:01:44

我一运行直接给我干死循环了,在 main 函数里的 a 数组要么用 memset 或初始化,要么放到 main 函数外面去,否则很容易死循环或者RE


by jcf666 @ 2024-07-14 23:15:51

AC代码:

#include <iostream>
using namespace std;
int n,a[2000],i,i2,i3=0,i4=0,s,bl=0;
int main()
{

    cin>>n;
    for(i=0;i<n*n;i++)
    {    
        cin>>a[i];
        i4++;               
    }
    for(i=0;i<i4;i++)       
    {
        for(i2=0;i2<a[i];i2++)
        {
            cout<<bl;
            i3++;
            if(i3==n)
            {     
                cout<<endl;
                i3=0;
            }
        }
        if(bl==0)
            bl=1;
        else
            bl=0;
    }
    return 0;
}

改动点

1.在 main 函数里的 a 数组要么用 memset 或初始化,要么放到 main 函数外面去,否则很容易死循环或者RE

  1. 把第8行的 i+=a[i] 改为 i++ 就能正常输入,且后面程序的运行就没有问题了,原输入里输入完后 a 数组里的值很分散,改成 i++ 后就能解决这个问题

3.由于题目中的 N \le 200 ,所以说你的一维数组至少开到 40000 以上,所以我就把你的 a 数组稍微扩容了一(亿~)下下

另外你的代码有点太长了,可以参考一下我的解法,希望对你有些帮助:

#include<bits/stdc++.h>
using namespace std;
int n,a[100001],k,flag=0,last=1;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    while(cin>>k){
        for(int i=last;i<=last+k;i++)a[i]=flag;
        last+=k;
        flag=!flag;
    }
    for(int i=1;i<=n*n;i++){
        cout<<a[i];
        if(i%n==0)cout<<"\n";
    }
    return 0;
}

by gat_Coding @ 2024-07-15 15:36:04

@jcf666 谢谢谢谢


|