奇怪的getline以及洛谷评测机

P1649 [USACO07OCT] Obstacle Course S

over_caykl @ 2023-01-26 02:24:02

第8个测试点我已经下载了,以下代码是可以通过样例和第八个测试点的(本地)。然而提交全Wa。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e2+5;

int n; 
char a[N*2][N*2];
int x,y,tx,ty;
int d[6][6]=
{{0,0},
{1,0},  
{-1,0},
{0,-2},
{0,2}};

bool check(int xx,int yy){
    if(xx<1||xx>n||yy<0||yy>=2*n-1) return 1;
    return 0;
}

int ans=1e9;
bool bk[N*2][N*2],qwq;

void dfs(int nx,int ny,int lst,int res){
    if(res>=ans) return;
    if(nx==tx&&ny==ty){
        ans=min(ans,res);
        qwq=1;
        return;
    }
    for(int i=1;i<=4;i++){
        int px=nx+d[i][0],py=ny+d[i][1];
        if(check(px,py)) continue;
        if(!bk[px][py]){
            bk[px][py]=1;
            int f=0;
            if(i!=lst) f=1;if(lst==-1) f=0;
            dfs(px,py,i,res+f);
            bk[px][py]=0;
        }
    }
}

int main(){
    cin>>n; getchar();
    for(int i=1;i<=n;i++)
        cin.getline(a[i],2*n+1);
    int len=n*2-1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<len;j++){
            if(a[i][j]=='A') x=i,y=j,bk[i][j]=1;
            else if(a[i][j]=='B') tx=i,ty=j;
            else if(a[i][j]=='x') bk[i][j]=1;
        }
    dfs(x,y,-1,0ll);
    if(qwq) cout<<ans;
    else cout<<"-1";
    return 0;
}

改大了getline的第二个参数(比如写成10000等),只Wa掉了第8个点,但是本地测试是正确的。

不是很懂,我的代码是有ub还是什么,导致评测出现错误,从而使结果与本地结果不一样。求帮。


by Acoipp @ 2023-01-26 08:17:58

洛谷评测机是 Linux 版本的,换行符以 \r 结尾,并不是 Windows 中的以 \r\n 结尾。

可以去 洛谷在线IDE 测试一下。


by Acoipp @ 2023-01-26 08:18:42

而 getline 函数是读取到 \n 结束,有可能会读到一些不存在的字符。


by Eznibuil @ 2023-01-26 09:46:56

@dlsk_po 婷婷,Linux 是 \n 结尾,不要误人子弟


by Acoipp @ 2023-01-26 13:14:14

@Eznibuil 哦,对对,抱歉


|