社区讨论

Fwb Round 2 T2 75 pts 求调,悬关

题目总版参与者 2已保存回复 15

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
15 条
当前快照
1 份
快照标识符
@mhjdny1m
此快照首次捕获于
2025/11/04 00:51
4 个月前
此快照最后确认于
2025/11/04 06:15
4 个月前
查看原帖
呜呜呜,没调出来。
CPP
#include <bits/stdc++.h>
#define PII pair <int, int>
#define LL long long
#define ST string
#define DB double

#define fr(x, y, z) for(int x = y; x <= z; x ++ )
#define dfr(x, y, z) for(int x = y; x >= z; x -- )

using namespace std;

const int N = 60;
int n, farm = -1, nrk;
char s[5][N], x, y, z;
int P[5][N], sze[5];
char pk[30] = {' ', '3', '4', '5', '6', '7', '8', '9', 'S', 'J', 'Q', 'K', 'A', '2', 'X', 'D'};
int sz[10] = {0, 1, 2, 3, 4};

unordered_map <char, int> rk;

bool cp(int x, int &lei, int &lstp)
{
    fr(i, lstp + 1, nrk)
    {
        if(P[x][i] == sz[lei])
        {
            if(lei == 3)
            {
                int hvd = 0;
                fr(j, 1, nrk) 
                {
                    if(j != i && P[x][j])
                    {
                        hvd = j;
                        break;
                    }
                }
                if(hvd == 0) continue;

                P[x][hvd] -- ;
                P[x][i] -= 3;
                sze[x] -= 4;
                lstp = i;
                cout << x << ' ' << pk[i] << ' ' << sz[lei] << '\n';
                cout << x << ' ' << pk[hvd] << ' ' << 1 << '\n';
                // cout << "LSTP " << lstp << '\n';

                return true;
            }
            else 
            {
                if(lei == 1 && ((pk[i] == 'X' && P[x][rk['D']]) || (pk[i] == 'D' && P[x][rk['X']])))
                    continue;
                
                lstp = i;
                cout << x << ' ' << pk[i] << ' ' << sz[lei] << '\n';
                // cout << "LSTP " << lstp << '\n';
                P[x][i] -= sz[lei];
                sze[x] -= sz[lei];
                return true;
            }
        }
    }

    if(lei != 4)
    {
        fr(i, 1, nrk) if(P[x][i] == 4)
        {
            cout << x << ' ' << pk[i] << ' ' << 4 << '\n';
            lei = 4;
            lstp = i;
            P[x][i] -= 4;
            sze[x] -= 4;
            return true;
        }
    } 

    if(P[x][rk['X']] && P[x][rk['D']])
    {
        cout << x << " X 1\n" << x << " D 1\n";
        sze[x] -= 2;
        lstp = 114514;
        P[x][rk['X']] -- ;
        P[x][rk['D']] -- ;
        lei = 4; return true;
    }

    cout << x << " Next\n";
    return false;
}

int nxt(int x)
{ return x == 2 ? 3 : (x + 1) % 3; }

void dofarm(int x, int lst, int lei, int lstp)
{
    // cout << "DF " << x << ' ' << lst << ' ' << lei << ' ' << lstp << ' ' << sze[x] << '\n';

        // cout << "\n" << x << ':';
        // fr(i, 1, nrk) cout << P[x][i] << '(' << pk[i] << ") "; 
        // cout << "\n\n";

    if(lst == x)
    {
        if(!sze[x]) 
        {
            cout << (x == farm ? "D\n" : "P\n");
            return ;
        }
        
        fr(i, 1, nrk)
        {
            int lei = 0;
            fr(j, 1, 3) if(P[x][i] == sz[j])
                lei = j;
            
            if(lei == 3) 
            {
                int hvd = 0;
                fr(j, 1, nrk) if(j != i && P[x][j])
                { hvd = j; break; }
                // cout << "HVD " << hvd << '\n';
                if(hvd)
                {
                    sze[x] -= 4;
                    P[x][hvd] -- , P[x][i] -= 3;
                    cout << x << ' ' << pk[i] << " 3\n";
                    cout << x << ' ' << pk[hvd] << " 1\n";
                    if(!sze[x]) 
                    {
                        cout << (x == farm ? "D\n" : "P\n");
                        return ;
                    }
                    dofarm(nxt(x), x, lei, i);
                    return ;
                }
            }
            else if(lei != 0)
            {
                if(lei == 1 && ((pk[i] == 'X' && P[x][rk['D']]) || (pk[i] == 'D' && P[x][rk['X']])))
                    continue;

                sze[x] -= sz[lei];
                P[x][i] -= sz[lei];
                cout << x << ' ' << pk[i] << ' ' << sz[lei] << '\n';

                if(!sze[x]) 
                {
                    cout << (x == farm ? "D\n" : "P\n");
                    return ;
                }

                dofarm(nxt(x), x, lei, i);
                return ;
            }
        }

        if(sze[x] != 3)
        {
            fr(i, 1, nrk) if(P[x][i] == 4)
            {
                P[x][i] -= 4;
                sze[x] -= 4;
                cout << x << ' ' << pk[i] << " 4\n";

                if(!sze[x]) 
                {
                    cout << (x == farm ? "D\n" : "P\n");
                    return ;
                }

                dofarm(nxt(x), x, 4, i);
                return ;
            }

            if(!sze[x]) 
            {
                cout << (x == farm ? "D\n" : "P\n");
                return ;
            }

            P[x][rk['X']] -- , P[x][rk['D']] -- ;
            sze[x] -= 2;
            cout << x << " X 1\n" << x << " D 1\n";

            if(!sze[x]) 
            {
                cout << (x == farm ? "D\n" : "P\n");
                return ;
            }

            dofarm(nxt(x), x, 4, 114514);
            return ;
        }

        if(sze[x] == 3) fr(i, 1, nrk)
        {
            if(!P[x][i]) continue;
            cout << x << ' ' << pk[i] << " 1\n";
            sze[x] -- , P[i][x] -- ;

            if(!sze[x]) 
            {
                cout << (x == farm ? "D\n" : "P\n");
                return ;
            }

            dofarm(nxt(x), x, 1, i);
            return ;
        }
    } 

    if(x != farm && lst != farm)
    {
        cout << x << " Next\n";
        dofarm(nxt(x), lst, lei, lstp);
    }
    else
    {
        if(cp(x, lei, lstp)) lst = x;
        // cout << "ACP " << x << ' ' << sze[x] << '\n';
        if(!sze[x]) 
        {
            cout << (x == farm ? "D\n" : "P\n");
            return ;
        }
        dofarm(nxt(x), lst, lei, lstp);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    fr(j, 1, 3) fr(i, 1, 17) 
        cin >> s[j][i];
    cin >> x >> y >> z;

    for(char i = '3'; i <= '9'; i ++ ) rk[i] = ++ nrk;
    rk['S'] = ++ nrk;
    rk['J'] = ++ nrk, rk['Q'] = ++ nrk;
    rk['K'] = ++ nrk, rk['A'] = ++ nrk;
    rk['2'] = ++ nrk;
    rk['X'] = ++ nrk;
    rk['D'] = ++ nrk;

    fr(i, 1, 3) sort(s[i] + 1, s[i] + 1 + 17, [](char x, char y) { return rk[x] < rk[y]; });

    fr(i, 1, 3)
    {
        fr(j, 1, 17) 
        {
            if(s[i][j] == 'D') farm = i;
            P[i][rk[s[i][j]]] ++ , sze[i] ++ ;
        }
        if(farm == i) P[i][rk[x]] ++ , P[i][rk[y]] ++ , P[i][rk[z]] ++ , sze[i] += 3;
    }

    // cout << rk['D'] << '\n';
    // cout << pk[rk['D']] << '\n';

    dofarm(farm, farm, 0, 0);

    return 0;
}


CPP
#include <bits/stdc++.h>
#define PII pair <int, int>
#define LL long long
#define ST string
#define DB double

#define fr(x, y, z) for(int x = y; x <= z; x ++ )
#define dfr(x, y, z) for(int x = y; x >= z; x -- )

using namespace std;

const int N = 60;
int n, farm = -1, nrk;
char s[5][N], x, y, z;
int P[5][N], sze[5];
char pk[30] = {' ', '3', '4', '5', '6', '7', '8', '9', 'S', 'J', 'Q', 'K', 'A', '2', 'X', 'D'};
int sz[10] = {0, 1, 2, 3, 4};

unordered_map <char, int> rk;

bool cp(int x, int &lei, int &lstp)
{
    fr(i, lstp + 1, nrk)
    {
        if(P[x][i] == sz[lei])
        {
            if(lei == 3)
            {
                int hvd = 0;
                fr(j, 1, nrk) 
                {
                    if(j != i && P[x][j])
                    {
                        hvd = j;
                        break;
                    }
                }
                if(hvd == 0) continue;

                P[x][hvd] -- ;
                P[x][i] -= 3;
                sze[x] -= 4;
                lstp = i;
                cout << x << ' ' << pk[i] << ' ' << sz[lei] << '\n';
                cout << x << ' ' << pk[hvd] << ' ' << 1 << '\n';
                // cout << "LSTP " << lstp << '\n';

                return true;
            }
            else
            {
                lstp = i;
                cout << x << ' ' << pk[i] << ' ' << sz[lei] << '\n';
                // cout << "LSTP " << lstp << '\n';
                P[x][i] -= sz[lei];
                sze[x] -= sz[lei];
                return true;
            }
        }
    }

    if(lei != 4)
    {
        fr(i, 1, nrk) if(P[x][i] == 4)
        {
            cout << x << ' ' << pk[i] << ' ' << 4 << '\n';
            lei = 4;
            lstp = i;
            P[x][i] -= 4;
            sze[x] -= 4;
            return true;
        }
    } 

    if(P[x][rk['X']] && P[x][rk['D']])
    {
        cout << x << " X 1\n" << x << " D 1\n";
        sze[x] -= 2;
        lstp = 114514;
        P[x][rk['X']] -- ;
        P[x][rk['D']] -- ;
        lei = 4; return true;
    }

    cout << x << " Next\n";
    return false;
}

int nxt(int x)
{ return x == 2 ? 3 : (x + 1) % 3; }

void dofarm(int x, int lst, int lei, int lstp)
{
    // cout << "DF " << x << ' ' << lst << ' ' << lei << ' ' << lstp << ' ' << sze[x] << '\n';

        // cout << "\n" << x << ':';
        // fr(i, 1, nrk) cout << P[x][i] << '(' << pk[i] << ") "; 
        // cout << "\n\n";

    if(lst == x)
    {
        if(!sze[x]) 
        {
            cout << (x == farm ? "D\n" : "P\n");
            return ;
        }
        
        fr(i, 1, nrk)
        {
            int lei = 0;
            fr(j, 1, 3) if(P[x][i] == sz[j])
                lei = j;
            
            if(lei == 3) 
            {
                int hvd = 0;
                fr(j, 1, nrk) if(j != i && P[x][j])
                { hvd = j; break; }
                // cout << "HVD " << hvd << '\n';
                if(hvd)
                {
                    sze[x] -= 4;
                    P[x][hvd] -- , P[x][i] -= 3;
                    cout << x << ' ' << pk[i] << " 3\n";
                    cout << x << ' ' << pk[hvd] << " 1\n";
                    if(!sze[x]) 
                    {
                        cout << (x == farm ? "D\n" : "P\n");
                        return ;
                    }
                    dofarm(nxt(x), x, lei, i);
                    return ;
                }
            }
            else if(lei != 0)
            {
                if(lei == 1 && ((pk[i] == 'X' && P[x][i + 1]) || (pk[i] == 'D' && P[x][i - 1])))
                    continue;
                    
                sze[x] -= sz[lei];
                P[x][i] -= sz[lei];
                cout << x << ' ' << pk[i] << ' ' << sz[lei] << '\n';

                if(!sze[x]) 
                {
                    cout << (x == farm ? "D\n" : "P\n");
                    return ;
                }

                dofarm(nxt(x), x, lei, i);
                return ;
            }
        }

        if(sze[x] != 3)
        {
            fr(i, 1, nrk) if(P[x][i] == 4)
            {
                P[x][i] -= 4;
                sze[x] -= 4;
                cout << x << ' ' << pk[i] << " 4\n";

                if(!sze[x]) 
                {
                    cout << (x == farm ? "D\n" : "P\n");
                    return ;
                }

                dofarm(nxt(x), x, 4, i);
                return ;
            }

            P[x][rk['X']] -- , P[x][rk['D']] -- ;
            sze[x] -= 2;
            cout << x << " X 1\n" << x << " D 1\n";

            if(!sze[x]) 
            {
                cout << (x == farm ? "D\n" : "P\n");
                return ;
            }

            dofarm(nxt(x), x, 4, 114514);
            return ;
        }

        if(sze[x] == 3) fr(i, 1, nrk)
        {
            if(!P[x][i]) continue;
            cout << x << ' ' << pk[i] << " 1\n";
            sze[x] -- , P[i][x] -- ;

            if(!sze[x]) 
            {
                cout << (x == farm ? "D\n" : "P\n");
                return ;
            }

            dofarm(nxt(x), x, 1, i);
            return ;
        }
    } 

    if(x != farm && lst != farm)
    {
        cout << x << " Next\n";
        dofarm(nxt(x), lst, lei, lstp);
    }
    else
    {
        if(cp(x, lei, lstp)) lst = x;
        // cout << "ACP " << x << ' ' << sze[x] << '\n';
        if(!sze[x]) 
        {
            cout << (x == farm ? "D\n" : "P\n");
            return ;
        }
        dofarm(nxt(x), lst, lei, lstp);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    fr(j, 1, 3) fr(i, 1, 17) 
        cin >> s[j][i];
    cin >> x >> y >> z;

    for(char i = '3'; i <= '9'; i ++ ) rk[i] = ++ nrk;
    rk['S'] = ++ nrk;
    rk['J'] = ++ nrk, rk['Q'] = ++ nrk;
    rk['K'] = ++ nrk, rk['A'] = ++ nrk;
    rk['2'] = ++ nrk;
    rk['X'] = ++ nrk;
    rk['D'] = ++ nrk;

    fr(i, 1, 3) sort(s[i] + 1, s[i] + 1 + 17, [](char x, char y) { return rk[x] < rk[y]; });

    fr(i, 1, 3)
    {
        fr(j, 1, 17) 
        {
            if(s[i][j] == 'D') farm = i;
            P[i][rk[s[i][j]]] ++ , sze[i] ++ ;
        }
        if(farm == i) P[i][rk[x]] ++ , P[i][rk[y]] ++ , P[i][rk[z]] ++ , sze[i] += 3;
    }

    // cout << rk['D'] << '\n';
    // cout << pk[rk['D']] << '\n';

    dofarm(farm, farm, 0, 0);

    return 0;
}

回复

15 条回复,欢迎继续交流。

正在加载回复...