美文网首页
西山居 9.11 笔试题

西山居 9.11 笔试题

作者: Plutorres | 来源:发表于2021-09-14 17:45 被阅读0次

描述

给出 3 * 3 方阵,你需要在其中填入数字 1 ~ 9,使其每一行和每一列的元素之和为15
其中一些位置上的数字已经给出,空出的位置用 0 表示
若存在解,则输出任意一个结果方阵即可
否则输出 "Not Found"

分析

这是一道 深搜 & 回溯剪枝 的问题
考虑遍历整个方阵
若当前位置已有数字,直接向下搜索即可
若为空位,则遍历所有剩余的数字,尝试填入其中,向下搜索

确定了搜索方式之后就是确定剪枝策略
考虑每一行和每一列的最后一个位置,当我们搜索到这些位置的时候,需要填入的数字是确定的
若该位置已有数字已有数字且不满足和为15的条件
或者需要填入的数字已经被使用过,那么就可以剪枝了

当搜索到最后一个位置时,用异或运算求出唯一没有被使用的数字
同时考察行和列是否满足条件,如果满足,那么就说明找到了一个解,就可以直接返回了

代码

#include <cstdio>

int g[9], vis, flag;

int getX(int k) {
    if (k % 3 == 2) return 15 - g[k - 2] - g[k - 1];
    else if (k / 3 == 2) return 15 - g[k - 6] - g[k - 3];
    return 0;
}

void output() {
    printf("%d %d %d\n", g[0], g[1], g[2]);
    printf("%d %d %d\n", g[3], g[4], g[5]);
    printf("%d %d %d\n", g[6], g[7], g[8]);
}

void dfs(int k) {
    if (flag) return;
    if (k == 8) {
        int x = g[8] ? g[8] : ((1 << 9) - 1) ^ vis;

        if (g[2] + g[5] + x == 15 && g[6] + g[7] + x == 15) {
            g[8] = x;
            output();
            flag = 1;
            return;
        }
    }

    int x = getX(k);
    if (x == 0) {
        if (g[k]) dfs(k + 1);
        else {
            for (int i = 1; i <= 9; ++i) {
                if (vis & (1 << (i - 1))) continue;
                vis ^= (1 << (i - 1));
                g[k] = i;
                dfs(k + 1);
                g[k] = 0;
                vis ^= (1 << (i - 1));
            }
        }
    }
    else {
        if (g[k] == x) dfs(k + 1);
        else if (g[k] == 0 && !(vis & (1 << (x - 1)))) {
            vis ^= (1 << (x - 1));
            g[k] = x;
            dfs(k + 1);
            g[k] = 0;
            vis ^= (1 << (x - 1));
        }
    }
}

int main() {
    for (int &x: g) {
        scanf("%d", &x);
        if (x) vis |= (1 << (x - 1));
    }

    dfs(0);
    return 0;
}

相关文章

  • 西山居 9.11 笔试题

    描述 给出 3 * 3 方阵,你需要在其中填入数字 1 ~ 9,使其每一行和每一列的元素之和为15其中一些位置上的...

  • 9.11 小米上机试题

    [编程题]序列模式匹配给定文本text和待匹配字符串pattern,二者皆只包含小写字母,并且不为空。在text中...

  • 9.11毛笔初探

    由于宣纸的发明比较晚,所以远古人类很大的一部分作品是刻画在墙壁或者日常用品上的。今天,我们就欣赏了古代中国的陶器,...

  • TiDB 在西山居实时舆情监控系统中的应用

    公司简介 西山居创建 1995 年初夏,在美丽的海滨小城珠海,西山居工作室孕育而生,一群西山居居士们十年如一日尅勊...

  • 2022年,最新iOS开发笔试题-界面篇(附答案)

    前言: iOS面试题 一共分为笔试题和面试题两部分 笔试题 一共分为10个 总共613题 面试题 一共400题 笔...

  • 【斩笔·秋分】37/52 (9.11~9.17)

    一、读书清单。 《高倍速阅读法》未完成 不想看书,只看备考书也是很无聊的呀。 二、电影清单 《熔炉》韩影,完结。 ...

  • 闽西山居

    窗外远山披绿釉, 庭前植桂又种柚。 松竹岁寒相为友, 鸡鸭满山信步游。

  • 360笔试题

    1. 在函数F中,本地变量a和b的构造函数(constructor)和析构函数(destructor)的调用顺序是...

  • Slate Simple Editor

    References西山居彭于晏 Slate 介绍分析与实践 知乎

  • 二斤茶叶

    国家打老虎,顺带着打苍蝇。 西山居委会的主任柳无言摊上事了! 事情的起因是龙岗区的邱书记落马,书记把西山居委会主任...

网友评论

      本文标题:西山居 9.11 笔试题

      本文链接:https://www.haomeiwen.com/subject/mpgfgltx.html