1 条题解

  • 0
    @ 2025-3-9 15:58:00

    每列随便放,最后再检查,评测机够快就过了

    #include <bits/stdc++.h>
    using namespace std;
    int tot = 0; // 记录当前有了几个方案
    int ans[10]; // ans[i] 记录第 i 列放在了第 ans[i] 行
    // 前 now-1 列放好了,考虑第 now 列放在第几行
    void dfs(int now)
    {
        if (now == 9)
        {
            bool flag = true;
            // 前 8 列放好了之后就检查
            // (ans[1],1) (ans[2],2) (ans[3],3)
            for (int i = 1; i <= 8; i++)
                for (int j = i + 1; j <= 8; j++)
                {
                    // 检查 (ans[i],i) 与 (ans[j],j) 是否冲突
                    if (ans[i] == ans[j] ||
                        i == j ||
                        ans[i] - i == ans[j] - j ||
                        ans[i] + i == ans[j] + j)
                    {
                        flag = false;
                        break;
                    }
                }
            if (flag)
            {
                // 找到了一个新方案
                tot++;
                cout << "No. " << tot << "\n";
                for (int i = 1; i <= 8; i++)
                {
                    for (int j = 1; j <= 8; j++)
                        if (i == ans[j])
                            cout << 1 << " ";
                        else
                            cout << 0 << " ";
                    cout << "\n";
                }
            }
            return;
        }
        for (int i = 1; i <= 8; i++)
        {
            ans[now] = i;
            dfs(now + 1);
            ans[now] = 0;
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        dfs(1); // 从第一列开始考虑
        return 0;
    }
    

    每次放之前先检查一下,跑得飞快

    #include <bits/stdc++.h>
    using namespace std;
    int tot = 0; // 记录当前有了几个方案
    int ans[10]; // ans[i] 记录第 i 列放在了第 ans[i] 行
    // 前 now-1 列放好了,考虑第 now 列放在第几行
    void dfs(int now)
    {
        if (now == 9)
        {
            // 找到了一个新方案
            tot++;
            cout << "No. " << tot << "\n";
            for (int i = 1; i <= 8; i++)
            {
                for (int j = 1; j <= 8; j++)
                    if (i == ans[j])
                        cout << 1 << " ";
                    else
                        cout << 0 << " ";
                cout << "\n";
            }
            return;
        }
        for (int i = 1; i <= 8; i++)
        {
            // 放之前先检查和前面放的是否冲突
            // 当前想要放在 (i,now)
            // 检查与 (ans[j],j) 是否冲突
            bool flag = true;
            for (int j = 1; j < now; j++)
            {
                if (i == ans[j] ||
                    now == j ||
                    i + now == ans[j] + j ||
                    i - now == ans[j] - j)
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                ans[now] = i;
                dfs(now + 1);
                ans[now] = 0;
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        dfs(1); // 从第一列开始考虑
        return 0;
    }
    
    • 1

    信息

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