返回题解分享
讨论 / 题解分享/ 帖子详情

扑克序列(结果填空) - 题解

#include <bits/stdc++.h>

using namespace std;

int a[] = {1, 1, 2, 2, 3, 3, 4, 4};
int out[8];
bool ist[8], done;

bool check() {
    bool ist_[5];
    memset(ist_, false, sizeof ist_);
    for (int i = 0; i < 8; i ++) 
        if (!ist_[1] && out[i] == 1) {
            for (int j = i + 1; j < 8; j ++) {
                if (out[j] == 1) {
                    if (j - i - 1 != 1) return false;
                    ist[1] = true;
                    break;
                }
            }

        if (!ist_[2] && out[i] == 2) 
            for (int j = i + 1; j < 8; j ++) {
                if (out[j] == 2) {
                    if (j - i - 1 != 2) return false;
                    ist[2] = true;
                    break;
                }
            }

        if (!ist_[3] && out[i] == 3) 
            for (int j = i + 1; j < 8; j ++) {
                if (out[j] == 3) {
                    if (j - i - 1 != 3) return false;
                    ist[3] = true;
                    break;
                }
            }

        if (!ist_[4] && out[i] == 4) 
            for (int j = i + 1; j < 8; j ++) {
                if (out[j] == 4) {
                    if (j - i - 1 != 4) return false;
                    ist[4] = true;
                    break;
                }
            }
    }
    return true;
}
void dfs(int u) {
    if (done) return;
    if (u == 8) {
        if (check()) {
            for (int i = 0; i < 8; i ++) {
                if (out[i] == 1) cout << 'A';
                else cout << out[i];
            }
            puts("");
            done = true;
        }
        return;
    }

    for (int i = 0; i < 8; i ++) {
        if (!ist[i]) {
            ist[i] = true;
            out[u] = a[i];
            dfs(u + 1);
            ist[i] = false;
        }
    }
}

int main(void) {
    dfs(0);
    return 0;
}
1 回复 0 转发 1 喜欢 8 阅读
回复 (1)
默认 最新
露米 2026/3/11
看到你分享的题解了,DFS 的思路很清晰,代码整体结构也很容易读懂。

在看 check() 函数的时候,我留意到一个可能需要微调的小地方:在判断数字距离时,代码里似乎用的是全局的 ist 数组,而不是函数内部定义的 ist_。因为全局的 ist 在 DFS 递归中承担着标记位置的任务,如果在校验时修改它,可能会对搜索过程产生一点影响。

另外,大括号的嵌套逻辑也可以再观察一下,看看是不是把几个判断都并列放置会更稳妥。

你可以从这个角度再试试看。如果调整中有遇到不确定的地方,我们可以再一起讨论 🙂
另外,这种全排列配合约束校验的思路非常扎实。如果你之后想尝试更简洁的写法,也可以了解一下 std::next_permutation 这个函数,它在处理这类题目时也是个很棒的小助手。

期待看到你跑出正确结果的那一刻,加油,慢慢来就好 🙂
0