RE真的陪我一辈子

P1746 离开中山路

Chinami_Nagisa @ 2024-08-12 10:41:27

难道是getchar的问题??有边界判断数组应该不会越界呀,运行结果也是对的

#include <utility>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int n;
typedef pair<int,int> PII;
queue<PII> q;
char g[1010][1010];
int d[1010][1010];
int x1,x2,Y1,y2;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};//上下左右
void bfs(int sx,int sy)
{
    q.push({sx,sy});
    d[sx][sy]=0;
    while(!q.empty())
    {
        PII t=q.front();
        q.pop();          //弹出队头
        for(int i=0;i<4;i++)
        {
            int a=t.first+dx[i];
            int b=t.second+dy[i];   //将要到达的坐标
            if(a<1||a>n||b<1||b>n) continue;   //先判断是否越界
            if(g[a][b]=='1'||d[a][b]!=-1) continue;   //再判断是否有障碍或已走过
            q.push({a,b});   //坐标入队
            d[a][b]=d[t.first][t.second]+1;
            if(a==Y1&&b==y2) return;
        }
    }
}
int main(){
    memset(d,-1,sizeof(d));
    scanf("%d",&n);
    getchar();
    for(int i=1;i<=n;i++,getchar())
        for(int j=1;j<=n;j++)
            scanf("%c",&g[i][j]);
    scanf("%d%d%d%d",&x1,&x2,&Y1,&y2);
    bfs(x1,x2);
    printf("%d",d[Y1][y2]);
}

结果就是清一色的紫……


by lovely_codecat @ 2024-08-12 10:44:51

#include <bits/stdc++.h>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int n;
typedef pair<int,int> PII;
queue<PII> q;
char g[1010][1010];
int d[1010][1010];
int x1,x2,Y1,y2;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};//上下左右
void bfs(int sx,int sy)
{
    q.push({sx,sy});
    d[sx][sy]=0;
    while(!q.empty())
    {
        PII t=q.front();
        q.pop();          //弹出队头
        for(int i=0;i<4;i++)
        {
            int a=t.first+dx[i];
            int b=t.second+dy[i];   //将要到达的坐标
            if(a<1||a>n||b<1||b>n) continue;   //先判断是否越界
            if(g[a][b]=='1'||d[a][b]!=-1) continue;   //再判断是否有障碍或已走过
            q.push({a,b});   //坐标入队
            d[a][b]=d[t.first][t.second]+1;
            if(a==Y1&&b==y2) return;
        }
    }
}
int main(){
    memset(d,-1,sizeof(d));
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        for(int j=1;j<=n;j++){
            g[i][j]=s[j-1];
        }
    }
    scanf("%d%d%d%d",&x1,&x2,&Y1,&y2);
    bfs(x1,x2);
    printf("%d",d[Y1][y2]);
}

@Chinami_Nagisa

就是getchar的问题


by Chinami_Nagisa @ 2024-08-12 10:52:19

@lovely_codecat 所以这样频繁调用getchar会有什么影响??


by complexor @ 2024-08-12 10:57:19

确实是 getchar RE 了 因为测试数据里的windows格式换行符实际上是两个字符 /r/n 虽然NOI系列赛事用的linux下的换行符确实是一个,但是建议使用更可靠的读入字符,比如: scanf("%s") 读入字符串 或者 scanf(" %c") 读入,前面加一个空格就可以跳过所有不可见字符


by yangjinxuan123456 @ 2024-08-24 16:57:23

#include <bits/stdc++.h>
using namespace std;
int n;
typedef pair<int,int> PII;
queue<PII> q;
char g[1010][1010];
int d[1010][1010];
int x1,x2,Y1,y2;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void bfs(int sx,int sy)
{
    q.push({sx,sy});
    d[sx][sy]=0;
    while(!q.empty())
    {
        PII t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int a=t.first+dx[i];
            int b=t.second+dy[i];
            if(a<1||a>n||b<1||b>n) continue;
            if(g[a][b]=='1'||d[a][b]!=-1) continue;
            q.push({a,b});
            d[a][b]=d[t.first][t.second]+1;
            if(a==Y1&&b==y2) return;
        }
    }
}
int main(){
    memset(d,-1,sizeof(d));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf(" %c",&g[i][j]);
    scanf("%d%d%d%d",&x1,&x2,&Y1,&y2);
    bfs(x1,x2);
    printf("%d",d[Y1][y2]);
    return 0;
}

@Chinami_Nagisa


|