1 条题解

  • 0
    @ 2025-3-23 14:43:18

    单独开 vis 记录有没有算过

    #include <bits/stdc++.h>
    using namespace std;
    bool vis[1005][1005]; // 标记每组参数有没有算过
    bool book[1005][1005];
    bool dfs(int a, int b)
    {
        if (a > b)
            swap(a, b);
        if (vis[a][b] == true)
            return book[a][b];
        if (b % a == 0)
            return true;
        // 在 b 减去 i 个 a
        for (int i = 1; i * a <= b; i++)
            if (dfs(a, b - i * a) == false)
            {
                vis[a][b] = true;
                return book[a][b] = true;
            }
        vis[a][b] = true;
        return book[a][b] = false;
    }
    int main()
    {
        int a, b;
        while (cin >> a >> b)
        {
            if (a == 0 && b == 0)
                break;
            if (dfs(a, b))
                cout << "win\n";
            else
                cout << "lose\n";
        }
        return 0;
    }
    

    在 book 中同时记录有没有算过

    #include <bits/stdc++.h>
    using namespace std;
    // -1 表示没算过,0 表示假,1 表示真
    int book[1005][1005];
    bool dfs(int a, int b)
    {
        if (a > b)
            swap(a, b);
        if (book[a][b] != -1)
            return book[a][b];
        if (b % a == 0)
            return true;
        // 在 b 减去 i 个 a
        for (int i = 1; i * a <= b; i++)
            if (dfs(a, b - i * a) == false)
                return book[a][b] = true;
        return book[a][b] = false;
    }
    int main()
    {
        for (int i = 1; i <= 1000; i++)
            for (int j = 1; j <= 1000; j++)
                book[i][j] = -1;
        int a, b;
        while (cin >> a >> b)
        {
            if (a == 0 && b == 0)
                break;
            if (dfs(a, b))
                cout << "win\n";
            else
                cout << "lose\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    438
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    (无)
    递交数
    111
    已通过
    35
    上传者