华为机试题 Sudoku
简介
使用回溯算法.
其实回溯算法属于暴力算法. 进行一定的减枝算法即可.
这里要使用弱检查, 全局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的更多相关文章
- 牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 华为机试题【13】-wave数组找字母游戏
题目描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你 ...
- 华为机试题【10】-求数字基root
题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一 ...
- 华为机试题——数组排序,且奇数存在奇数位置,偶数存在偶数位置
题目要求很简单,就是给你一个数组,对它进行排序,并且排序后,奇数要放在奇数的位置上,偶数要放在偶数的位置上,如果不满足这个规则的话就在数组上填充0 实现代码如下,文中值得注意的一点就是如何判读这个数字 ...
- 求一个int型整数的两种递减数之和(java)--2015华为机试题
题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的 ...
- 2017华为机试题--Floyd算法
小K是X区域的销售经理,他平常常驻"5"城市,并且经常要到"1"."2"."3"."4"." ...
- 华为机试题 N阶楼梯的走法,每次走一步或者两步
在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 ...
- 华为机试题:仿LISP
package com.nowcoder.huawei; import java.util.*; public class LISP { // 只通过80% // (+ (* 2 3) (^ 4)) ...
- 牛客网:华为机试题(python版本)
输入一行:input() 输入的一行有多个信息:input().split() 有多组测试用例(多组同时输入): while true try except... 1.计算字符串最后一个单词的长度,单 ...
- 2014华为机试西安地区B组试题
2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...
随机推荐
- Golang 版本导致的容器运行时问题
问题现场 用户反馈安装了某个 containerd 版本的节点无法正常拉起容器,业务场景是在 K8S Pod 里面运行一个 Docker,在容器里面通过 docker 命令再启动新的容器. 报错信息如 ...
- .NET CORE API接口的分组、版本管理
参照: Asp.net Core的Swagger接口根据模块.版本分组 (bbsmax.com)
- 使用DVC管理大文件变更历史(基于git)
DVC(Data Version Control) 是一个专门用于管理数据和二进制文件版本控制 的工具,它特别适合那些需要处理大量非文本文件(如图像.视频.模型.数据集等)的项目. 一般地,如果项目中 ...
- 2.1k star! 抓紧冲,DeepChat:连接AI与个人世界的智能助手的开源项目
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 DeepChat是一款开源的跨平台智能助手工具,它如同AI世界的"万能转换插头&q ...
- RabbitMQ消息的生存时间TTL(Time To Live)
目录 RabbitMQ消息的生存时间TTL MQ环境测试准备 代码实现 生产者 8080 测试 死信队列 自定义ttl消息 过期丢弃消息 总结 RabbitMQ消息的生存时间TTL TTL(Time ...
- MySql技术之"虚拟表增加索引"
一.虚拟表增加索引 创建虚拟表,并且增加SKU索引:INDEX idx_sku (sku) CREATE TEMPORARY TABLE t_sku_analy_temp ( sku VARCHAR( ...
- 区块链共识算法--PoW
PoW算法为一种概率算法,其共识结果是临时的,随着时间推移或某种强化,共识结果被推翻的概率越来越小,最终称为事实上结果 1 研究 工作量证明(Proof Of Work,简称POW),简单理解就是一份 ...
- TPLINK路由器重启脚本(软件版本3.0.0)
家中的两个路由器全都是TPLink路由器,由于总出现时间一长就网卡的原因,写了这个重启脚本在每天凌晨五点的时候对路由器进行自动重启 使用方法: self.logindata的值为登录时的jso ...
- 2025最好的Next.js面试
2025最好的Next.js面试题(一) 最近在面试,就写一些关于问到的面试题,同时也过一下知识点. 基础概念 什么是Next.js?它与React的关系是什么? Next.js是一个基于React的 ...
- 利用DeepSeek与Python自动生成测试用例!
在当今快节奏的软件开发领域,自动化测试已然成为保障软件质量的中流砥柱.传统手动编写测试用例的方式,非但耗时费力,还极易遗漏关键场景. 所幸,AI 技术的飞速发展为我们带来了全新的解决方案.今天,就让我 ...