简介

使用回溯算法.

其实回溯算法属于暴力算法. 进行一定的减枝算法即可.

这里要使用弱检查, 全局flag 进行退出.

code

#include <iostream>
#include <vector>
#include <set>
#include <map>
using namespace std; void input(int a[][9], vector<pair<int, int>> &v){
for(int i=0; i<9; i++){
for(int j = 0; j<9; j++){
cin >> a[i][j];
if(a[i][j] == 0) v.push_back({i,j});
}
}
}
void output(int a[][9]) {
for(int i=0; i<9; i++){
for(int j = 0; j<9; j++){
if(j==0) cout << a[i][j];
else cout << " " << a[i][j];
}
cout << endl;
}
} bool checkRow(int a[][9], int row){
set<int> s;
for(int j=0; j<9; j++){
if(a[row][j] != 0)
s.insert(a[row][j]);
}
if(s.size() == 9) {
return true;
}
return false;
} bool checkRowWeak(int a[][9], int row){
set<int> s;
int count = 0;
for(int j=0; j<9; j++){
if(a[row][j] != 0) {
s.insert(a[row][j]);
count++;
}
}
if(s.size() == count) { // 无重复
return true;
}
return false;
} bool checkColWeak(int a[][9], int col){
set<int> s;
int count = 0;
for(int i=0; i<9; i++){
if(a[i][col] != 0) {
s.insert(a[i][col]);
count++;
}
}
if(s.size() == count) {
return true;
}
return false;
} bool checkCol(int a[][9], int col){
set<int> s;
for(int i=0; i<9; i++){
if(a[i][col] != 0)
s.insert(a[i][col]);
}
if(s.size() == 9) {
return true;
}
return false;
} bool checkBlock(int a[][9], int row, int col) {
int blockRow = (row / 3) * 3;
int blockCol = (col / 3) * 3;
set<int> s;
for(int i=blockRow; i<blockRow + 3; i++){
for(int j = blockCol; j < blockCol + 3; j++){
if(a[i][j] != 0)
s.insert(a[i][j]);
}
}
if(s.size() == 9) return true;
return false;
} bool checkBlockWeak(int a[][9], int row, int col) {
int blockRow = (row / 3) * 3;
int blockCol = (col / 3) * 3;
int count = 0;
set<int> s;
for(int i=blockRow; i<blockRow + 3; i++){
for(int j = blockCol; j < blockCol + 3; j++){
if(a[i][j] != 0) {
count++;
s.insert(a[i][j]);
}
}
}
if(s.size() == count) return true;
return false;
} bool check(int a[][9], int i, int j) {
if(checkColWeak(a, j) && checkRowWeak(a, i) && checkBlockWeak(a, i, j)){
return true;
}
return false;
}
bool flag = false;
void dfs(int a[][9], int index, map<pair<int, int>, bool> &vis, vector<pair<int, int>> & v) {
if(index == v.size()){
flag = true;
return;
}
int row = v[index].first;
int col = v[index].second;
bool ch = false;
for(int i=0; i<9; i++){
a[row][col] = i+1;
if(check(a, row, col)) {
dfs(a,index+1,vis,v);
}
if(flag) break;
a[row][col] = 0;
}
} int main() {
int a[9][9] = {0};
vector<pair<int, int>> v;
input(a, v);
map<pair<int, int>, bool> vis;
dfs(a, 0, vis, v);
output(a);
}

华为机试题 Sudoku的更多相关文章

  1. 牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  2. 华为机试题【13】-wave数组找字母游戏

    题目描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你 ...

  3. 华为机试题【10】-求数字基root

    题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一 ...

  4. 华为机试题——数组排序,且奇数存在奇数位置,偶数存在偶数位置

    题目要求很简单,就是给你一个数组,对它进行排序,并且排序后,奇数要放在奇数的位置上,偶数要放在偶数的位置上,如果不满足这个规则的话就在数组上填充0 实现代码如下,文中值得注意的一点就是如何判读这个数字 ...

  5. 求一个int型整数的两种递减数之和(java)--2015华为机试题

    题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的 ...

  6. 2017华为机试题--Floyd算法

    小K是X区域的销售经理,他平常常驻"5"城市,并且经常要到"1"."2"."3"."4"." ...

  7. 华为机试题 N阶楼梯的走法,每次走一步或者两步

    在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 ...

  8. 华为机试题:仿LISP

    package com.nowcoder.huawei; import java.util.*; public class LISP { // 只通过80% // (+ (* 2 3) (^ 4)) ...

  9. 牛客网:华为机试题(python版本)

    输入一行:input() 输入的一行有多个信息:input().split() 有多组测试用例(多组同时输入): while true try except... 1.计算字符串最后一个单词的长度,单 ...

  10. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

随机推荐

  1. app自动化的特殊操作

    一.截屏 File srcfile=driver.getScreenshotAs(OutputType.FILE); //得到截图源文件对象 File dstfile=new File("C ...

  2. 2025dsfz集训Day6: 数论

    DAY6: 数论 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling 快速幂 快速幂是针对快速 ...

  3. 一个Controller网关根据请求参数和版本号调用分发多个Service和方法

    一个Controller网关根据请求参数和版本号分发Service 公司原有项目就是根据请求参数进行分发逻辑的,这次想着通过反射加入了版本号的分发,减轻各种版本的业务代码逻辑耦合度. 在一个项目中需要 ...

  4. 炸裂!!!Deepseek接入个人知识库,回答速度飞起来,确实可以封神了

    高效管理知识.快速获取信息成为提升工作效率的关键.无论是做技术的同学还是普通的上班族,在日常积累了大量的知识数据和内容.项目文档.会议记录到技术手册.业务流程,这些信息如同宝藏一般,等待着被高效利用. ...

  5. Sublime Text4 4192 安装和一键激活

    介绍 此教程用于Windows 下Sublime Text4 4192版本的安装和激活. 无需安装其他软件,无需下载替换文件,无需注册机等. 官网: https://www.sublimetext.c ...

  6. Spring编程式事务控制

    目录 Spring编程式事务控制 代码实现 测试 Spring编程式事务控制 实际中很少使用 代码实现 pom.xml <?xml version="1.0" encodin ...

  7. 代码随想录第四天 | Leecode 24. 两两交换链表、19.删除链表的倒数第N个节点、 面试题 02.07. 链表相交、 142.环形链表II

    Leecode 24 两两交换链表 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 1: 输入:h ...

  8. 【BUG】Message = “无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。“, StackTrace = “ 在 System.Reflection.

    环境: Visual Studio 2019 C#项目遇到这种情况时,是因为有多个依赖出了问题(也可能是只有一个但被误报成多个),此时点开"查看详细信息",可以快速监视Except ...

  9. VS Code 插件 clangd的用法

    VS Code 插件 clangd的用法 目录 深入理解 VS Code 插件 clangd 的用法 1. clangd 的核心原理:语言服务器协议 (LSP) 与 Clang 分析 关键点: 2. ...

  10. Linux系列:聊一聊 SystemV 下的进程间共享内存

    一:背景 1. 讲故事 昨天在分析一个 linux 的 dump 时,看到了这么一话警告,参考如下: 0:000> !eeheap -gc *** WARNING: Unable to veri ...