写万行代码地小盆友 2024-11-03 11:41 采纳率: 0%
浏览 8

求调!CSP-J第二题

CSP-J 2024 第二轮的第二题地图探险,求调!
洛谷题目链接:https://www.luogu.com.cn/problem/P11228
样例1的测试数据2输出了15(详见下文),求调!洛谷上交只有30分。个人感觉是输入的问题吧。

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

int n, m, k, x, y, d, ans, x2, y2, T;
char ch;//string ss;
bool a[1005][1005];
void input() {
    //cout << "dddd" << endl;
    getchar();
    scanf("%d%d%d%d%d%d", &n, &m, &k, &x, &y, &d);
    //cout << "eeee" << endl;
    for (int j = 1; j <= n; j++) {
        //scanf("%s", ss);
        for (int l = 1; l <= m; l++) {
            scanf("%c", &ch);
            a[j][l] = (ch == 'x');
        }
        getchar();
    }
}
void get_xy2() {
    if(d == 0) {
        x2 = x;
        y2 = y + 1;
    }
    else if(d == 1) {
        x2 = x + 1;
        y2 = y;
    }
    else if(d == 2) {
        x2 = x;
        y2 = y - 1;
    }
    else if(d == 3) {
        x2 = x - 1;
        y2 = y;
    }
}
void inspect_move() {
    if(1 <= x2 && x2 <= n && 1 <= y2 && y2 <= m && (!a[x2][y2])) {
        x = x2;
        y = y2;
        ans ++;
    }
    else {
        d = (d + 1) % 4;
    }
}
void one_test() {
    input();
    ans = 1;
    for (int j = 1; j <= k; j++) {
        get_xy2();
        inspect_move();
    }
    printf("%d\n", ans);
}
int main() {
    scanf("%d", &T);
    for (int i = 1; i <= T; i++) {
        one_test();
    }
    return 0;
}

其中,样例1的输入输出是:

2
1 5 4
1 1 2
....x
3
5 5 20
1 1 0
.....
.xxx.
.x.x.
..xx.
x....
15

  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-11-03 11:42
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,你的代码大体逻辑是正确的,但是在处理输入时存在一些问题。在读取字符矩阵时,每一行的末尾你需要读取一个换行符,否则当读取下一个字符矩阵时,会从上一个矩阵的最后一个字符继续读取。另外,在读取字符时,你使用了 scanf("%c", &ch),这是正确的,但在读取完每一行后,你需要再次使用 getchar() 来吸收缓冲区中的换行符。否则,这个换行符会影响到下一行的读取。你可以按照以下方式修改你的代码:

    void input() {
        scanf("%d%d%d%d%d%d", &n, &m, &k, &x, &y, &d);
        getchar(); // 吸收数字输入后的换行符
        for (int j = 1; j <= n; j++) {
            for (int l = 1; l <= m; l++) {
                scanf(" %c", &ch); // 在%c前加一个空格来忽略前面的空白字符(包括空格、换行符等)
                a[j][l] = (ch == 'x');
            }
            getchar(); // 吸收行末的换行符
        }
    }
    

    修改后应该可以解决你的问题。同时也要注意一下格式控制空格的问题,在 scanf(" %c", &ch) 中的空格是必要的,用来忽略前面的空白字符(包括空格、换行符等)。希望这个修改能帮助你解决问题。如果还有其他问题,请继续提问。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月3日