小米笔试 小米笔试题 1019

笔试时间:2024年10月19 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:数独计数

时间限制: C/C++语言 1000MS;其他语言 3000MS,内存限制:C/C++语言65536KB;其他语言 589824KB

小明最近热衷于数独游戏。在厌倦了传统数独后,他想到一个有趣的规则:有3x3的方格,他要把1~9的这9个数字不重不漏地填入这9个方格,并且保证填入的每个数字周围没有临近数,例如在中间位置填了数字4,那么数字3和5不能出现在数字4上下左右四个位置中任何一个。 现在小明已经填上了几个数字,他想知道一共有多少种符合上述规则的填充方案,当且仅当至少存在一个位置在这两种方案中填充的数字不同时,两种填充方案被认为是不同的。

输入描述

第一行1个整数T,表示数据组数。

对每组数据,有三行,每行三个整数。

这三行三列中的第i行第j列的数aij代表题面描述中的3x3方格对应位置的情况。

如果aij=0表示那个格子还未填充;

如果是一个[1,9]范围内的整数表示小明已填好的数字。

保证至少有一个格子未填充,已填充的格子不会出现重复数字,但有可能不合法。

1≤T≤100,其中0≤aij≤9。

输出描述

对于每组数据,输出一行一个整数表示答案,即合法的填充方案数,使得最终结果中任何一个位置上下左右相邻的数(如果有的话)与该位置的数绝对值之差不为1,且不重不漏用完1~9这9个数字。形式化地,要求对任意位置ij满足a(i-1)j,a(¡+1)j,ai(j-1),ai(j+1)(如果存在)与aij的绝对值之差不为1,且不重不漏使用完9个数字.如果没有任何可行的方案,输出0。

样例输入

2

1 8 5

4 6 3

0 2 0

1 3 5

2 6 8

2 7 0

样例输出

2

0

参考题解

回溯枚举。由于数据只有3*3,因此直接使用暴力的解法枚举所有的可能即可。递归的参数选择从一个数组 i 开始,挨个数字去尝试,需要保证这个数字未使用过。对于每一个数字i,遍历所有可能的位置,也就是两个for枚举9宫格的可放置数字的位置。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <set>
#include <cmath>

using namespace std;

int T;
vector<vector<int>> grid(3, vector<int>(3));
set<int> vst;
int res;

bool check(int x, int y, int v) {
    const int directions[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    for (int k = 0; k < 4; k++) {
        int nx = x + directions[k][0];
        int ny = y + directions[k][1];
        if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3) {
            if (grid[nx][ny] == 0) continue;
            if (abs(grid[nx][ny] - grid[x][y]) == 1) return false;
        }
    }
    return true;
}

void dfs(int i) {
    if (i > 9) {
        res++;
        return;
    }
    if (vst.count(i)) {
        dfs(i + 1);
        return;
    }
    for (int x = 0; x < 3; x++) {
        for (int y = 0; y < 3; y++) {
            if (grid[x][y] == 0 && check(x, y, i)) {
                grid[x][y] = i;
                dfs(i + 1);
                grid[x][y] = 0;
            }
        }
    }
}

int main() {
    cin >> T;
    while (T--) {
        vst.clear();
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                cin >> grid[i][j];
                if (grid[i][j] != 0) {
                    vst.insert(grid[i][j]);
                }
            }
        }

        res = 0;
        dfs(1);
        cout << res << endl;
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    static int[][] grid = new int[3][3];
    static Set<Integer> vst = new HashSet<>();
    static int res;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        while (T-- > 0) {
            vst.clear();
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    grid[i][j] = sc.nextInt();
                    if (grid[i][j] != 0) {
                        vst.add(grid[i][j]);
                    }
                }
            }

            res = 0;
            dfs(1);
            System.out.println(res);
        }
        sc.close();
    }

    static boolean check(int x, int y, int v) {
        int[][] directions = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
        for (int[] dir : directions) {
            int nx = x + dir[0];
            int ny = y + dir[1];
            if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3) {
                if (grid[nx][ny] == 0) continue;
                if (Math.abs(grid[nx][ny] - grid[x][y]) == 1) return fals

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

点赞 评论 收藏
分享
03-13 00:04
已编辑
吉林大学 Java
约面的挺突然。。狠下心接了1.自我介绍2.讲讲JAVA的反射3.可以继续讲讲AOP,动态代理[&nbsp;因为讲反射不小心吟唱到了例如AOP的动态代理,但是这块记忆的非常不熟,结果磕磕绊绊&nbsp;]4.项目我看你写了AOP和注解,具体怎么实现滑动窗口限流的[&nbsp;梦到什么说什么,吟唱八股发散千万不要散到自己不熟悉的区域&nbsp;]5.也讲讲为什么另一个项目选择令牌桶,具体流程6.&nbsp;OK,讲讲&nbsp;Redis&nbsp;的数据类型?还有吗?就了解这五种嘛[&nbsp;把5个的基础类型从应用对比到历届底层全都吟唱了一遍。一句还有吗直接没力气了,简历就写了理解5种,别的我是真一点没看TT&nbsp;]7.讲讲Redission分布式锁实现8.这个指数退避怎么实现的9.在这里有考虑去保障幂等性嘛10.这里为什么使用指数退避呢?&nbsp;什么时候用均匀重传[已经晕过去了说不了解,刚说了后就意识到,估计应该说指数退避能缓解压力防止下游服务器雪崩之类的]11.ok,那讲讲JMM12.讲讲RocketMQ如何保证的不丢消息13.讲讲RocketMQ延迟消息原理14.讲讲项目Redis实现会话记忆这一块15.如果ai调用function&nbsp;calling出现幻觉,有考虑怎么解决吗?[&nbsp;不了解,面试官说什么接口幂等化,高危操作人工防护,没在听,感觉人已经飞升了TT&nbsp;]16.mcp了解嘛?和function&nbsp;calling有什么区别[&nbsp;依旧不了解,只能说了个前者规范架构抽象解耦,后者耦合高只能算个工具调用]17.AI生成代码的代码质量怎么保障,那平时如何review的呢18.算法。lc215&nbsp;&nbsp;数组中最大第k个元素19.打算考研还是本科就业20.反问1️⃣有哪里不足,有哪些需要提高的部分。[主要说知识广度不够,多刷算法,让我别太紧张]2️⃣部门业务会做什么人生第二次面试。感觉大厂面试官的气场压力很大应该凉了不过这次面试非常锻炼心态,多面试,多面试。
冰炸橙汁_不做oj版:redis除了五种基本数据类型,其他的几种还是要掌握一下的,挺常用
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务