大佬看看为什么只有70分啊

P1746 离开中山路

LittleOcean @ 2024-10-11 22:53:08

#include<iostream>
#include<queue>
#include<cstring>
#include <algorithm>
using namespace std;
#define N 1005
typedef pair<int,int> PII;
int n,x1,y1,x2,y2;
char map[N][N];
int dist[N][N];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
queue <PII> q;
int bfs(int x,int y){
    memset(dist,-1,sizeof dist);
    q.push({x,y});
    dist[x][y]=0;
    while(!q.empty()){
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int a=t.first+dx[i],b=t.second+dy[i];
            if(a<1 || a>n || b<1 || b>n)continue;
            if(map[a][b]=='1')continue;
            if(dist[a][b]>0)continue;
            q.push({a,b});
            dist[a][b]=dist[t.first][t.second]+1;
            if(a==x2 && b==y2)break;
        }
    }
    return dist[x2][y2];
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
       scanf("%s",map[i]);
    }
    cin>>x1>>y1>>x2>>y2;
    int res=bfs(x1,y1);
    cout<<res<<endl;
}

by 杜都督 @ 2024-10-11 23:47:20

@happycodehaha

下标错位了,scanf 后面加上 sprintf(map[i], "%s%s", "1", map[i]);


by LittleOcean @ 2024-10-12 19:03:18

for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>map[i][j];
        }

@杜都督 用sprintf通不过,本来我是一层循环改成双层循环输入通过了,大佬问一下为什么原来一层循环输入下标会错位啊,关注你了


by 杜都督 @ 2024-10-12 19:26:29

@happycodehaha

不是把 scanf 换成 sprintf,是在 scanf 那一行后面加一行 sprintf

因为你原来用字符串的方式输入 map 的每一行时,字符串默认下标是从 0 开始的,而题目约定的下标是从 1 开始的,所以读到的数据每一行的下标都比正确的数据向左偏移了一位

sprintf 是在读入每一行后都在前面加一个 1,用来对齐下标


by LittleOcean @ 2024-10-13 17:17:04

@杜都督 懂了谢谢


|