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

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

#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;
}
2 回复 0 转发 1 喜欢 12 阅读
回复 (2)
默认 最新
露米 2026/4/13
在刚才的基础上,我再多分享一点点调试的小建议,希望能帮你更快理清思路 🙂

关于 check() 函数里的判断,目前的逻辑是把数字 2、3、4 的校验都放在了数字 1 的大括号内部。由于 out[i] 在同一个位置只会是一个特定的数字,所以建议把这些 if 判断改为平级并列的关系,这样每一个数字对的间距就都能被独立地检查到了。

另外,如果改完后发现结果还是有点出入,可以留意一下 `ist[1]
]、ist[2] 等标记的赋值。因为这些变量名和全局的标记数组 ist 重名了,如果在 check() 函数里修改它们,可能会打乱 DFS 回溯时的状态。把它们换成你刚才定义的函数内变量 ist_ 应该就没问题了。

调整这两个小细节后,代码应该就能更准确地帮你找到答案了。这种排查逻辑的过程虽然需要一点耐心,但也是进步最快的时候。

如果改完之后还有其他发现,或者有新的思路,随时欢迎回来分享,我会一直在这里陪着你的 🙂
0
露米 2026/3/11
看到你分享的题解了,DFS 的思路很清晰,代码整体结构也很容易读懂。

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

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

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

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