1 条题解

  • 0
    @ 2025-4-14 8:13:44

    解题思路

    首先很容易判断出当前坐标(x,y)(x, y)落在白格子上的条件是q(x/S)+q(y/S)q(x / S) + q(y / S) 为奇数, qq表示下取整。

    那么可以从起点不断地循环跳,并用上述条件判断是否跳到了白格子, 如果不在白格子,则对当前当前坐标模SS,当(x(x % S, y % S)已经被访问过时说明无解。

    这里有一个要注意的地方,这个地方让我AA了很多次,那就是:

    模运算时如果xx % 2 == 0(或者yy % 2 == 0)时即落在边界上,需要判断这个点是在格子最左侧边界还是在右侧边界,判断的方法是判断当前这个格子的颜色,如果是黑格子则为起始处,如果是白格子则是在最右侧。

    标程

    #include <iostream>
    #include <cstring>
    #define MAX_N 1005
    using namespace std;
    
    bool v[MAX_N + 1][MAX_N + 1];
    
    int main() {
        long long S, x, y, dx, dy;
        while (cin >> S >> x >> y >> dx >> dy && (S + x + y + dx + dy) != 0) {
            for (int i = 0; i <= MAX_N; ++i) {
                for (int j = 0; j <= MAX_N; ++j) {
                    v[i][j] = false;
                }
            }
            long long curX = x, curY = y, steps = 0;
            bool can = true;
            while (true) {
                long long r1 = curX % S, r2 = curY % S;
                long long q1 = curX / S, q2 = curY / S;
                if (r1 != 0 && r2 != 0 && (q1 + q2) % 2 == 1) {
                    break;
                }
                // 判断在哪个边界
                if (r1 == 0 && (q1 + q2) % 2 == 1) {
                    r1 = S;
                }
                if (r2 == 0 && (q1 + q2) % 2 == 1) {
                    r2 = S;
                }
                if (v[r1][r2]) {
                    can = false;
                    break;
                }
                steps++;
                v[r1][r2] = true;
                curX += dx;
                curY += dy;
            }
            if (!can) {
                cout << "The flea cannot escape from black squares." << endl;
            } else {
                cout << "After " << steps << " jumps the flea lands at (" << curX << ", " << curY << ")." << endl;
            }
        }
        return 0;
    }
        
    
    • 1

    信息

    ID
    729
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者