华为机试题 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 ...
随机推荐
- 刷题——关于struts框架,下面那些说法是正确的?
关于struts框架,下面那些说法是正确的? Struts中无法完成上传功能 Struts框架基于MVC模式 Struts框架容易引起流程复杂.结构不清晰等问题 Struts可以有效地降低项目的类文件 ...
- element-ui $prompt输入弹框和$confirm确认弹框用法--输入框默认值、校验、阻止关闭等问题
可输入弹框 $prompt 1.默认值.校验 this.$prompt( '请输入文件夹名称:', '提示', { confirmButtonText: '确定', cancelButtonText: ...
- Fastjson命令执行漏洞复现2(fastjson <=1.2.47)
一.搭建环境: 第一种:Docker一键拉取环境 htttps://github.com/vulhub/vulhub/tree/master/fastjson/1.2.47-rce 第二种:tomac ...
- 基于SaaS纯BS架构的全院级PACS系统
2014年曾经做过一版简单的Dicom Web Viewer,之前的Web版本由于技术和功能的极限性,仅能简单的运用于临床阅片和患者的电子胶片使用,无法普及到放射和超声等影像科室.影像科 ...
- 超越代码生成:AI 如何重塑软件开发全生命周期 (SDLC)? (需求、测试到部署)
引言:AI 不止写代码,软件开发的"全链路"变革已至 各位技术圈的朋友们,提到 AI 在软件开发中的应用,恐怕大多数人首先想到的还是 GitHub Copilot.DeepSeek ...
- k8sd之pod生命周期
pod生命周期: 状态:pending 挂起 没有节点满足条件 running 运行 Failed sucess unkonwn pod生命周期中的重要行为: 初始化容器 容器探测:liveness ...
- 【保姆级教程】:开源 Qwen3 本地化部署实操详细教程
一.教学环境 1.1Panel:现代化.开源Linux服务器管理面板 2.Ollama:开源大语言模型管理平台 3.MaxKB:强大易用的企业级 AI 助手 二.实操步骤 步骤1.1Panel 安装: ...
- Git-如何区分使用个人账户和公司账户
个人日常编写点小玩具,code 的版本控制一般托管于GitHub,但是公司内部使用 GitLb 来进行代码版本控制,这样为了能够在同一台 MacBook(自带,公司有补贴)日常区分出两个账户,通过翻阅 ...
- 【教程】Ubuntu 16.04 配置 CLion 开发 ROS Melodic
[教程]Ubuntu 16.04 配置 CLion 开发 ROS Melodic 目录 [教程]Ubuntu 16.04 配置 CLion 开发 ROS Melodic 笔者环境 步骤 下载安装 CL ...
- odoo14里面附件传输接口
@http.route('/fmcg/download/pdf', type='http', auth="public", csrf=False, cors='*') def up ...