小米笔试 小米笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。