用scanf输入的一个坑
查看原帖
用scanf输入的一个坑
961972
Lele_Programmer楼主2023/6/22 17:27

这是AC代码:

#include <bits/stdc++.h>
using namespace std;

int n,m,mx,my,dx,dy,st;
char arr[2005][2005];
int step[2005][2005];
int drt[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
queue<pair<int,int> > q;

void init() {
    scanf("%d %d\n",&n,&m);
    for (int i=0;i<n;++i) {
        for (int j=0;j<m;++j) {
            while (true) {
                scanf("%c",&(arr[i][j]));
                if (!isspace(arr[i][j])) {
                    break;
                }
            }
            if (arr[i][j]=='d') {
                dx=i;
                dy=j;
            } else if (arr[i][j]=='m') {
                mx=i;
                my=j;
            }
        }
    }
    for (int i=0;i<2005;++i) {
        for (int j=0;j<2005;++j) {
            step[i][j]=0x7fffffff;
        }
    }
    st=0;
    q.push(make_pair(mx,my));
}

bool check(int x,int y) {
    if (x>=0 && y>=0 && x<n && y<m) {
        if (arr[x][y]=='.' || arr[x][y]=='d') {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

void bfs() {
    int gx,gy,all,count;
    all=1;
    count=0;
    while (!q.empty()) {
        gx=q.front().first;
        gy=q.front().second;
        q.pop();
        if (st<step[gx][gy]) {
            step[gx][gy]=st;
            for (int i=0;i<4;++i) {
                if (check(gx+drt[i][0],gy+drt[i][1])) {
                    q.push(make_pair(gx+drt[i][0],gy+drt[i][1]));
                }
            }
        }
        ++count;
        if (count==all) {
            count=0;
            all=q.size();
            ++st;
        }
    }
}

void output() {
    if (step[dx][dy]==0x7fffffff) {
        printf("No Way!");
    } else {
        printf("%d",step[dx][dy]);
    }
}

int main() {
    init();
    bfs();
    output();
    return 0;
}

其中输入地图的代码是:

while (true) {
                scanf("%c",&(arr[i][j]));
                if (!isspace(arr[i][j])) {
                    break;
                }
            }

用来去除空字符(换行空格这些) 然而,将输入地图的那部分代码换成:

scanf("%c",&(arr[i][j]));
            if (!isspace(arr[i][j])) {
                break;

只是单纯去除换行的话,只有一个AC,其他全部WA,那就说明数据输入的时候有可能给你一堆空字符(换行空格之类的) (为此调了整个中午......)

2023/6/22 17:27
加载中...