我很好奇,关于输入方法导致的错误,及本地编译和在线IDE的问题

P1320 压缩技术(续集版)

yezl @ 2022-07-04 22:31:00

近一年没碰OI,重拾,练手,结果这题一堆WA直接给我整不会了……

这是0 pts代码(然鹅可能并没有错):

#include<bits/stdc++.h>
using namespace std;
const int N=205;
char ch;
int n=1,k=1,a[N],tt;
bool f;
int main()
{
    //freopen("ans.txt","w",stdout);
    ch=getchar();
    f=ch-'0';
    if(f) a[++tt]=0;
    while(ch=getchar())
    {
        if(ch=='1')
        {
            if(!f) a[++tt]=k,k=0;
            ++k,++n,f=1;
        }
        else if(ch=='0')
        {
            if(f) a[++tt]=k,k=0;
            ++k,++n,f=0;
        }
        else break;
    }
    printf("%d ",n);
    for(register int i=1;i<=tt;++i)
        printf("%d ",a[i]);
    for(register int i=1;i<n;++i)
    {
        for(register int j=0;j<=n;++j)
        {
            ch=getchar();
            if(ch=='1')
            {
                if(!f)
                {
                    printf("%d ",k);
                    k=0;
                }
                ++k,f=1;
            }
            else if(ch=='0')
            {
                if(f)
                {
                    printf("%d ",k);
                    k=0;
                }
                ++k,f=0;
            }
        }
    }
    printf("%d ",k);
    return 0;
}

因为稍快,所以平时习惯用getchar读入。 代码大概就是先求一行得 \texttt{n} ,然后算后 \texttt{n-1} 行。知道getchar会多读个换行所以有多循环一次。本地样例过,提交WA。

数据下载,运行,答案一模一样……排查了好半天,想可能是测评机的锅,放尼谷在线IDE上跑,结果——

5 0 5 2 1 2 5 2 1 2 2 (IDE结果)
5 0 5 2 1 2 5 2 1 2 5 (答案)
5 0 5 2 1 2 5 2 1 2 5 (本地输出)

这就不能理解了呀。。getchar改成scanf照样不行(都会读换行)最后无奈换成cin直接给我过了……

想问一下问题究竟出在哪? 考场上如果遇到这种情况怎么办呢?本地一直试可能也找不出问题吧。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=205;
char ch;
int n=1,k=1,a[N],tt;
bool f;
int main()
{
    //freopen("ans.txt","w",stdout);
    ch=getchar();
    f=ch-'0';
    if(f) a[++tt]=0;
    while(ch=getchar())
    {
        if(ch=='1')
        {
            if(!f) a[++tt]=k,k=0;
            ++k,++n,f=1;
        }
        else if(ch=='0')
        {
            if(f) a[++tt]=k,k=0;
            ++k,++n,f=0;
        }
        else break;
    }
    printf("%d ",n);
    for(register int i=1;i<=tt;++i)
        printf("%d ",a[i]);
    for(register int i=1;i<n;++i)
    {
        for(register int j=1;j<=n;++j)
        {
            cin>>ch;
            if(ch=='1')
            {
                if(!f)
                {
                    printf("%d ",k);
                    k=0;
                }
                ++k,f=1;
            }
            else if(ch=='0')
            {
                if(f)
                {
                    printf("%d ",k);
                    k=0;
                }
                ++k,f=0;
            }
        }
    }
    printf("%d ",k);
    return 0;
}

by panyanppyy @ 2022-07-04 22:46:05

用getchar的话可以行末多读一个字符


by yezl @ 2022-07-04 23:23:06

@panyanppyy 问题是……我的行末确实有多读一个字符哦。。。之前也有遇到过很多这种情况,一般是多读个就行啦,但这次直接给我翻了。


by panyanppyy @ 2022-07-05 07:10:01

@yezl 洛谷数据最后有两个换行,一个是\n一个是\r


|