网课:数独挑战——牛客(题解与疑问)


 

题目描述

数独是一种填数字游戏,英文名叫 Sudoku,起源于瑞士,上世纪 70 年代由美国一家数学逻辑游戏杂志首先发表,名为 Number Place,后在日本流行,1984 年将 Sudoku 命名为数独,即 “独立的数字” 的缩写,意思是 “在每一格只有一个数字”。

2004 年,曾任中国香港高等法院法官的高乐德 (Wayne Gould) 把这款游戏带到英国,成为英国流行的数学智力拼图游戏。

玩家需要根据 9×99 \times 99×9 盘面上的已知数字,推理出所有剩余位置的数字,并满足每一行、每一列、每一个粗线九宫格内的数字包含有 1-9 的数字,且不重复。

现在给你一个数独,请你解答出来。每个数独保证有且只有一个解。

输入描述:

输入仅一组数据,共 9 行 9 列,表示初始数独(其中 0 表示数独中的空位)。

输出描述:

输出共 9 行 9 列,表示数独的解。注意⾏末没有空格。

示例1

输入

5 3 0 0 7 0 0 0 0
6 0 0 1 9 5 0 0 0
0 9 8 0 0 0 0 6 0
8 0 0 0 6 0 0 0 3
4 0 0 8 0 3 0 0 1
7 0 0 0 2 0 0 0 6
0 6 0 0 0 0 2 8 0
0 0 0 4 1 9 0 0 5
0 0 0 0 8 0 0 7 9

输出

5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9

想法:

本来我以为只要处理了行冲突和列冲突,九宫格冲突就自然而然可以消除了,其实是不行的,有点想当然了,又没去验证,直接这么写了。还有就是之前的写法中递归dfs函数那里,感觉写错了。我想写的是找出数独中没填的然后去填,但是这种写法遇到已经填了的格子的话就会直接结束,而不会再去找没填的空格,根本无法遍历整个数独。代码如下。

void dfs(int x,int y){
    if(x>9) {
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                cout<<sd[i][j];
                if(j!=9) cout<<' ';
                else cout<<endl;
            }
        }
        return ;
    }
    int xx=x,yy=y;
    if(y<9) yy+=1;
    else { xx+=1,yy=1;}
    if(sd[xx][yy]==0){
        for(int i=1;i<=9;i++){
            if(r[xx][i]==0&&c[yy][i]==0){
                sd[xx][yy]=i;//填数字
                dfs(xx,yy);
                sd[xx][yy]=0;
            } 
        }
    }
}

然后我就修改了,可是吧,还是不行,没有输出。感觉改了还是错了,首先对于整个数组我全都标记了行冲突,列冲突,没分类。其次呢,我dfs递归的终止条件好像没用。最后,我在填数字时又没有标记行冲突,列冲突。反正很多问题吧。

代码:

#include<bits/stdc++.h>
using namespace std;
int sd[15][15];
int r[15][15];
int c[15][15];
void dfs(int x,int y){
    if(x>9) {
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                cout<<sd[i][j];
                if(j!=9) cout<<' ';
                else cout<<endl;
            }
        }
        return ;
    }
    for(int i=x;;i++){
        for(int j=y+1;j<=9;j++){
            if(sd[i][j]==0){
                for(int k=1;k<=9;k++){
                    if(r[i][k]==0&&c[j][k]==0){
                        sd[i][j]=k;//填数字
                        dfs(i,j);
                        sd[i][j]=0;
                        break;//
                    } 
                }
            }
        }
    }
}
int main(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            cin>>sd[i][j];
            r[i][sd[i][j]]=1;
            c[j][sd[i][j]]=1;
        }
    }
            dfs(1,1);
}

网课:

我的想法和她的想法就是搜的复杂度不同,我是一格一格搜,她是只搜没填的空格。用了个结构体数组来记录没填的格子数量和下标。九宫格冲突图也处理得很巧妙,标记好各个九宫格的序号,然后处理。

代码:

#include<bits/stdc++.h>
using namespace std;
int r[15][15],c[15][15],jgg[15][15];
int sd[15][15];
struct Mt{
    int x,y;
} mt[100];
int cnt=0;
int xh[15][15]={{0,0,0,0,0,0,0,0,0,0},//序号
                {0,1,1,1,2,2,2,3,3,3},
                {0,1,1,1,2,2,2,3,3,3},
                {0,1,1,1,2,2,2,3,3,3},
                {0,4,4,4,5,5,5,6,6,6},
                {0,4,4,4,5,5,5,6,6,6},
                {0,4,4,4,5,5,5,6,6,6},
                {0,7,7,7,8,8,8,9,9,9},
                {0,7,7,7,8,8,8,9,9,9},
                {0,7,7,7,8,8,8,9,9,9}
               };
void dfs(int gs){
    if(gs>=cnt){
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                cout<<sd[i][j];
                if(j!=9) cout<<' ';
                else cout<<endl;
            }
        }
        return ;
    }
    for(int i=1;i<=9;i++){
        if(r[mt[gs].x][i]) continue;
        if(c[mt[gs].y][i]) continue;
        if(jgg[xh[mt[gs].x][mt[gs].y]][i]) continue;
        jgg[xh[mt[gs].x][mt[gs].y]][i]=1,r[mt[gs].x][i]=1,c[mt[gs].y][i]=1;
        sd[mt[gs].x][mt[gs].y]=i;
        dfs(gs+1);
        jgg[xh[mt[gs].x][mt[gs].y]][i]=0,r[mt[gs].x][i]=0,c[mt[gs].y][i]=0;
    }
}
int main(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            cin>>sd[i][j];
            if(sd[i][j]==0) { mt[cnt].x=i , mt[cnt].y=j; cnt++;}
            else {r[i][sd[i][j]]=1,c[j][sd[i][j]]=1,jgg[xh[i][j]][sd[i][j]]=1;}
        }
    }
    dfs(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777838.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

刘谦春晚纸牌魔术背后的数学—海明码原理简介

在昨天2024年的春晚舞台上&#xff0c;魔术大师刘谦以一场令人拍案叫绝的纸牌魔术再度震撼全场。他巧妙地利用了数学原理&#xff0c;精准无误地让观众“随机”选择的纸牌完成了配对&#xff0c;尤其是令人忍俊不禁的是主持人尼格买提的纸牌却没有如愿配对&#xff0c;小尼碎了…

机器学习复习(8)——逻辑回归

目录 逻辑函数&#xff08;Logistic Function&#xff09; 逻辑回归模型的假设函数 从逻辑回归模型转换到最大似然函数过程 最大似然函数方法 梯度下降 逻辑函数&#xff08;Logistic Function&#xff09; 首先&#xff0c;逻辑函数&#xff0c;也称为Sigmoid函数&#…

安全之护网(HVV)、红蓝对抗

文章目录 红蓝对抗什么是护网行动&#xff1f;护网分类护网的时间 什么是红蓝对抗红蓝对抗演练的目的什么是企业红蓝对抗红蓝对抗价值参考 红蓝对抗 什么是护网行动&#xff1f; 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方…

C++ 贪心 区间问题 区间选点

给定 N 个闭区间 [ai,bi] &#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N &#xff0c;表示区间数。 接下来 N 行&#xff0c;每行包含两…

洛谷p4391 无限传输

考察字符串周期的题 题目链接 结论 要求字串 s s s的最短循环字串长就是&#xff1a; a n s n − p m t [ n ] ansn-pmt[n] ansn−pmt[n] 证明如下&#xff1a; 这是最大的前缀和后缀 现在我们做如下操作&#xff1a; 补全字段 a a a和字段 b b b&#xff0c;按子段 a a a的…

Linux操作系统基础(五):Linux的目录结构

文章目录 Linux的目录结构 一、Linux目录与Windows目录区别 二、常见目录介绍&#xff08;记住重点&#xff09; Linux的目录结构 一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概…

AJAX——AJAX入门

1 什么是AJAX&#xff1f; Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于在Web应用程序中实现异步通信的技术。 简单点说&#xff0c;就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON、XML、HTML和test文本等格式发送和接收数据。 AJAX最吸…

机器学习系列——(十一)回归

引言 在机器学习领域&#xff0c;回归是一种常见的监督学习任务&#xff0c;它主要用于预测数值型目标变量。回归分析能够通过对输入特征与目标变量之间的关系建模&#xff0c;从而对未知数据做出预测。 概念 回归是机器学习中的一种监督学习方法&#xff0c;用于预测数值型目…

一个坐标系查询网站python获取所有坐标系

技术路线选择 我是使用的vue 3开发的网页界面&#xff0c;element-plus构建网页组件&#xff0c;openlayer展示地图&#xff0c;express提供后端API&#xff0c;vercel进行在线部署。 python获取所有坐标系 想要展示所有坐标系&#xff0c;那需要先获取坐标系&#xff0c;怎么…

Openwifi 开源项目解读(一)

Openwifi 是一个关于wifi 系统的开源项目&#xff0c;是一个少有的优秀的关于wifi的开源项目&#xff0c;项目中包括了wifi的基带、lowmac、linux驱动 等三部分&#xff0c;其中基带、lowmac部分是在FPGA中实现&#xff0c;wifi驱动部分是运行在Linux下&#xff0c;因此openwif…

【资料分享】基于单片机大气压监测报警系统电路方案设计、基于飞思卡尔的无人坚守点滴监控自动控制系统设计(程序,原理图,pcb,文档)

基于单片机大气压监测报警系统电路方案设计 功能&#xff1a;实现的是大气压检测报警系统&#xff0c;可以通过传感器实时检测当前大气压值&#xff0c;可以设定大气压正常范围&#xff0c;当超过设定范围进行报警提示。 资料&#xff1a;protues仿真&#xff0c;程序&#x…

【教学类-47-01】UIBOT+IDM下载儿童古诗+修改文件名

背景需求&#xff1a; 去年12月&#xff0c;我去了其他幼儿园参观&#xff0c;这是一个传统文化德育教育特色的学校&#xff0c;在“古典集市”展示活动中&#xff0c;小班中班大班孩子共同现场念诵《元日》《静夜思》包含了演唱版本和儿歌念诵版本。 我马上也要当班主任了&a…

C++ 贪心 区间问题 最大不相交区间数

给定 N 个闭区间 [ai,bi] &#xff0c;请你在数轴上选择若干区间&#xff0c;使得选中的区间之间互不相交&#xff08;包括端点&#xff09;。 输出可选取区间的最大数量。 输入格式 第一行包含整数 N &#xff0c;表示区间数。 接下来 N 行&#xff0c;每行包含两个整数 ai…

基于鲲鹏服务NodeJs安装

准备工作 查看当前环境 uname -a查看鲲鹏云CPU架构 cat /proc/cpuinfo# 查看CPU architecture项&#xff0c;8表示v8&#xff0c;7表示v7下载Node.js NodeJs 选择 Linux Binaries (ARM) ARMv8 wget -c https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-arm64.tar.xz…

WWW 万维网

万维网概述 万维网 WWW (World Wide Web) 并非某种特殊的计算机网络。 万维网是一个大规模的、联机式的信息储藏所。 万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点&#xff0c;从而主动地按需获取丰富的信息。 这种访问方式称为“链接”。 万维网是分…

【Kubernetes】在k8s1.24及以上版本基于containerd容器运行时测试pod从harbor拉取镜像

基于containerd容器运行时测试pod从harbor拉取镜像 1、安装高版本containerd2、安装docker3、登录harbor上传镜像4、从harbor拉取镜像 1、安装高版本containerd 集群中各个节点都要操作 yum remove containerd.io -y yum install containerd.io-1.6.22* -y cd /etc/containe…

Docker 有哪些常见的用途?

Docker 是一种容器化技术&#xff0c;它允许应用程序在不同的环境之间具有一致的运行环境。这使得 Docker 在开发和运维领域中非常受欢迎&#xff0c;因为它简化了应用程序的部署和管理。以下是 Docker 的一些常见用途&#xff1a; 快速部署应用程序 Docker 允许开发人员和运…

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easy_sql解析

查看网页 有提示&#xff0c;参数是wllm&#xff0c;并且要我们输入点东西 所以&#xff0c;我们尝试以get方式传入 有回显&#xff0c;但似乎没啥用 从上图看应该是字符型漏洞&#xff0c;单引号字符注入 先查看字段数 /?wllm2order by 3-- 没回显 报错了&#xff0c;说明…

Java编程构建高效二手交易平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Habitat环境学习四:Habitat-sim基础用于导航——使用导航网格NavMesh

如何使用导航网格NavMesh 官方教程1、NavMesh基础定义1.1 使用NavMesh的原因1.2 什么是NavMesh 2、NavMesh的使用方法2.1 获取自上而下Top down view视角地图2.2 在NavMesh中进行查询以及随机产生可导航点2.3 查找最短路径2.4 场景加载NavMesh2.5 重新计算并生成NavMesh2.6 什么…