当前位置: 首页 > news >正文

蓝桥杯第100 题 九宫幻方 DFS 全排列 C++ 解题思维

题目

九宫幻方icon-default.png?t=N7T8https://www.lanqiao.cn/problems/100/learning/?page=1&first_category_id=1&name=%E4%B9%9D

思路和解题方法  一 (DFS)

  1. 首先,定义了一些全局变量和数组。vis数组用于标记已经出现过的数字,a数组用于存储数独的初始状态和中间状态,ans数组用于存储找到的解决方案,p数组用于存储空白格子的坐标,n表示空白格子的数量,cnt记录解决方案的数量。

  2. check()函数用于检查当前填充的数字是否满足数独的规则。它首先计算对角线上的元素之和,然后检查每行和每列的和是否相等,并返回一个布尔值表示结果。

  3. dfs()函数是核心部分,使用递归实现深度优先搜索。它从第一个空白格子开始填充数字,每次填充一个数字后,递归调用自身继续填充下一个空白格子,直到所有空白格子都填充完毕。如果找到了符合数独规则的解决方案,则将其记录在ans数组中,并增加cnt的计数。

  4. main()函数中,首先读入数独的初始状态,并初始化相关变量。然后调用dfs()函数进行搜索。最后,根据搜索结果输出解决方案或提示"Too Many"表示找到了多个解决方案。

需要注意的是,该程序假设输入的数独有唯一解或没有解。如果存在多个解,则只会输出其中一个解。如果不存在解,则输出"Too Many"表示无法确定唯一解。

c++ 代码  1

#include<bits/stdc++.h>
using namespace std;int vis[10],a[5][5],ans[5][5];
// vis数组用来标记数字是否使用过,a数组记录数独题目的矩阵,ans数组用来存储解决方案
int n=1,cnt;
pair<int ,int>p[10];
// p数组用来存储空白格的坐标,n记录空白格的个数
bool check(){int sum=a[1][1]+a[2][2]+a[3][3];// 先计算左上到右下的斜线上的数字之和if(sum!=a[1][3]+a[2][2]+a[3][1]) return false;// 再计算右上到左下的斜线上的数字之和,如果不相等,则不是数独的解for(int i=1;i<=3;i++){int tmp1=0,tmp2=0;for(int j=1;j<=3;j++)tmp1+=a[i][j],tmp2+=a[j][i];//行和列的和相等 if(tmp1!=sum||tmp2!=sum) return false;}// 分别计算每行每列的数字之和,如果与斜线上的数字之和不相等,则不是数独的解return true;
} void dfs(int now){if(now>=n){if(check()){cnt++;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)ans[i][j]=a[i][j];// 如果当前数独矩阵是解,则令ans数组等于当前矩阵}return;}int x=p[now].first,y=p[now].second;for(int k=1;k<=9;k++){if(vis[k])continue;a[x][y]=k;vis[k]=1;dfs(now+1);a[x][y]=0;vis[k]=0;// 搜索之前先标记数字已经使用过,搜索完之后再回溯}
}int main()
{for(int i=1;i<=3;i++)for(int j=1;j<=3;j++){cin>>a[i][j];if(!a[i][j])p[n++]=make_pair(i,j);// 记录空白格的坐标vis[a[i][j]]=1;    // 标记数字已经使用过}dfs(1);//从第一个空白格开始搜索if(cnt==1){for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)cout<<ans[i][j]<<" \n"[j==3];}else cout<<"Too Many\n";// 如果有多个解,则输出"Too Many"return 0;}

 思路和解题方法   二 (全排列)

  1. 从标准输入中读入一个包含9个整数的数组a。
  2. 使用next_permutation函数生成arr数组的全排列,并逐个判断是否满足数独的条件。
  3. 如果某个排列满足数独条件,并且与输入数组a匹配,则将该排列赋值给数组a,并增加计数器ans的值。
  4. 最后根据计数器ans的值输出结果。如果有且仅有一个解,则输出解;如果有多个解,则输出"Too Many"。

c++ 代码

#include<iostream>
#include<algorithm>
#include<bits/stdc++.h> //包含一些常用的头文件,例如vector、string等
using namespace std;int a[10]; //定义一个长度为10的数组a,用于存储输入的数独初始状态
int ans = 0; //计数器,用于存储符合数独条件的解的个数
int arr[10] = {1,2,3,4,5,6,7,8,9}; //定义一个长度为10的数组arr,用于生成全排列//检查当前排列是否符合数独条件
bool check(int a[])
{int a1=a[0]+a[1]+a[2];int a2=a[3]+a[4]+a[5];int a3=a[6]+a[7]+a[8];int a4=a[0]+a[3]+a[6];int a5=a[1]+a[4]+a[7];int a6=a[2]+a[5]+a[8];int a7=a[2]+a[4]+a[6];int a8=a[0]+a[4]+a[8];if(a1==a2&&a2==a3&&a3==a4&&a4==a5&&a5==a6&&a6==a7&&a7==a8) //如果8个和相等,则返回true{return true;}return false; //否则返回false
}int main()
{for(int i = 0;i<9;i++) //读入初始数独状态{cin>>a[i];}while(next_permutation(arr,arr+9)){ //生成arr数组的全排列,逐个检查是否符合数独条件if(check(arr)) //如果符合数独条件{bool y = true;for(int i = 0;i<9;i++){if(a[i]!=0&&a[i]!=arr[i]) //如果输入的数独状态不为0且与当前排列不一致,则说明不是想要的解{y = false; //设置标志y为false}}if(y) //如果当前排列与输入的数独状态匹配{for(int i = 0;i<9;i++) //将当前排列赋值给数组a{a[i] = arr[i];}ans++; //计数器ans加1}}}if(ans == 1) //如果只有一个解,则输出该解{int cnt = 0; //计数器cnt,用于输出格式控制for(int i = 0;i<9;i++){if(cnt==3){cout<<endl; //每输出三个数字换行cnt = 0;}cout<<a[i]<<" "; //输出数独解cnt++; //计数器加1}}else { //如果有多个解,则输出"Too Many"printf("Too Many");}return 0;
}

知识点解释

next_permutation() 全排列

next_permutation()是一个函数,通常在编程语言中用于生成给定序列的下一个排列。它可以按照字典序(升序)生成给定序列的下一个排列,并将其更新为下一个排列。

具体而言,next_permutation()函数接受一个序列作为参数,并将该序列重排为下一个字典序更大的排列。如果没有下一个更大的排列,则将序列重排为最小的(升序)排列。该函数返回一个布尔值,指示是否成功生成了下一个排列。

下面是一个示例,展示了如何使用next_permutation()函数来生成给定序列的所有排列:

#include <iostream>#include <algorithm>using namespace std;​int main() {int arr[] = {1, 2, 3};​// 生成并打印所有排列do {for (int i = 0; i < 3; i++) {cout << arr[i] << " ";}cout << endl;} while (next_permutation(arr, arr + 3));​return 0;}

输出结果将是:

 1 2 31 3 22 1 32 3 13 1 23 2 1

这个例子展示了如何使用next_permutation()函数生成给定序列的所有排列,并将它们打印出来。每次调用next_permutation()函数时,原始数组会被修改为下一个排列,直到没有更多的排列可生成为止。

需要注意的是,next_permutation()函数在不同的编程语言和库中可能有略微不同的实现方式,但其基本功能是相似的:生成给定序列的下一个排列。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

相关文章:

蓝桥杯第100 题 九宫幻方 DFS 全排列 C++ 解题思维

题目 九宫幻方https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&name%E4%B9%9D 思路和解题方法 一 &#xff08;DFS) 首先&#xff0c;定义了一些全局变量和数组。vis数组用于标记已经出现过的数字&#xff0c;a数组用于存储数独的初始状态…...

NOI / 1.10编程基础之简单排序 提问05:分数线划定 c语言 结构体

描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才&#xff0c;A市对所有报名的选手进行了笔试&#xff0c;笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定&#xff0c;即如果计划录取m名志愿者&#xff0c;则面试…...

再探Docker:从Docker基础到跨服务器部署

摘要&#xff1a; 这篇文章将从介绍Docker基础开始&#xff0c;逐步讲解如何创建镜像、使用Docker Compose编排容器、在Docker中更新部署环境&#xff0c;将更新后的环境打包为镜像并导出为tar包&#xff0c;最后在其他服务器上应用这个镜像。 1. Docker是什么 Docker是一种容…...

C# 使用PanGu分词

写在前面 这是官方介绍&#xff1a;盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件&#xff0c;拥有大量用户。作者基于之前分词组件的开发经验&#xff0c;结合最新的开发技术重新编写了盘古分词组件。 盘古分词组件需要配合其字典文件使用&am…...

Termius 一款优秀的跨平台 SSH 客户端工具

&#x1f525;&#x1f525;&#x1f525; 作为程序员或者运维管理人员&#xff0c;我们经常需要使用终端工具来进行服务器管理及各种操作&#xff0c;比如部署项目、调试代码、查看/优化服务、管理服务器等。 而实现远程服务器连接需要借助 SSH 协议来进行&#xff0c;SSH&am…...

生命科学领域 - 新药从研发到上市全流程

新药是指新研制的、临床尚未应用的药物&#xff0c;其化学本质应为新的化合物或称新化学实体、 新 分子实体、新活性实体。新药研发的根本目的是治疗疑难危重疾病&#xff0c;研制出来的药物即使是全新的化学结构&#xff0c;但是疗效或安全性却不及现有的药物便失去新药价值&a…...

血的教训------入侵redis之利用python来破解redis密码

血的教训------入侵redis之利用python来破解redis密码 利用强大的python来进行redis的密码破解&#xff0c;过程不亦乐乎&#xff0c;当然也可以用shell脚本 本篇文章只供学习交流&#xff0c;请勿他用&#xff0c;谢谢。 其他相关联的文章 [1]VMware安装部署kail镜像服务器【…...

yolov8-pose 推理流程

目录 一、关键点预测 二、图像预处理 二、推理 三、后处理与可视化 3.1、后处理 3.2、特征点可视化 四、完整pytorch代码 yolov8-pose tensorrt 一、关键点预测 注&#xff1a;本篇只是阐述推理流程&#xff0c;tensorrt实现后续跟进。 yolov8-pose的tensorrt部署代码…...

笔记十七、认识React的路由插件react-router-dom和基本使用

react-router 分类 web使用 react-router-dom native使用 react-router-native anywhere&#xff08;使用麻烦&#xff09; react-router 安装 yarn add react-router-dom main.jsx import React from "react"; import ReactDOM from "react-dom/client"…...

CleanMyMac X4.14.5Crack最新Mac电脑清理优化最佳应用

CleanMyMac X 4.14.5是用于清理和优化Mac的最佳应用程序和强大工具。它看起来很棒而且很容易理解。该软件可以清理、保护、优化、稳定和维护您的 Mac 系统。您可以立即删除不必要的、不寻常的、无用的垃圾文件、损坏的文件垃圾&#xff0c;并释放大量内存空间。此外&#xff0c…...

Linux shell单双引号区别

shell单双引号区别&#xff1a; Shell脚本中很多时候都在用单引号或双引号来框住字符串&#xff0c;但是他们之间是存在区别的 避免踩坑记录… 单引号 单引号中的任何字符都没有特殊含义,即一些转义字符&#xff0c;$ 变量引用都会无效&#xff0c;它只把他们当作一个单纯的…...

ES 8.x开始(docker-compose安装、kibana使用、java操作)

学习文档地址 一、Docker安装 这里使用docker-compose来安装&#xff0c;方便后续迁移&#xff0c;Elasticserach和kibina一起安装。 1、创建安装目录 configdataplugins 2、配置文件 配置文件有两个&#xff0c;一个是ES的配置文件&#xff0c;一个docker-compose的配置文件 …...

有了倾斜摄影,如何搭建一座智慧城市?

随着无人机航测、倾斜摄影等全新一代测绘信息技术方法的发展&#xff0c;可以迅速搜集制作精细化的城市三维模型&#xff0c;搭建城市地理信息基础服务架构。 近期都在重点关注的“智慧城市”究竟是什么&#xff0c;有什么重大作用&#xff0c;同时又面临着什么难关&#xff0c…...

设计测试用例的具体方法总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️白马沉河共歃誓&#xff0c;怒涛没城亦不悔 ☁️基于需求进行测试用例的设计 基…...

计算机毕业设计|基于SpringBoot+MyBatis框架的仿天猫商城购物系统设计与实现

计算机毕业设计|基于SpringBootMyBatis框架的仿天猫商城购物系统设计与实现 迷你仿天猫商城是一个基于SSM框架的综合性B2C电商平台&#xff0c;需求设计主要参考天猫商城的购物流程&#xff1a;用户从注册开始&#xff0c;到完成登录&#xff0c;浏览商品&#xff0c;加入购物…...

JAXB的XmlValue注解

XmlValue注解用在Java属性、或者方法上。它可以使得映射到XML Schema中的Java类具有一个simpleContent 或者simpleType。 一个Java类中最多只能有一个属性被XmlValue注解。 如果被XmlValue注解的JavaBean属性是Java类中唯一映射到XML的成员&#xff0c;那么该Java类将会被映射…...

Git版本管理(05) git仓库迁移(保留原来记录分支体系)

说明&#xff1a;本文主要是一次git迁移仓库的实战记录。 1 迁移前的准备 仓库迁移前&#xff0c;需要将所有有必要的分支checkout到本地&#xff08;想要转移到新仓库的分支就都 checkout一遍&#xff09;&#xff0c;接下来将old仓库从远程仓库克隆到本地&#xff1a; $git…...

科技与教育:未来教育的新趋势

在21世纪&#xff0c;科技的快速发展正在深刻地改变教育行业。从在线学习平台到虚拟现实教室&#xff0c;科技为教育带来了革命性的变化。本文将探讨科技如何影响现代教育&#xff0c;并预测未来教育的发展趋势。 一、科技在教育中的应用 在线学习平台&#xff1a;通过平台如C…...

E云管家微信群聊机器人开发

请求URL&#xff1a; http://域名地址/modifyGroupRemark 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRo…...

CVE-2023-27524:Apache Superset未授权访问漏洞复现

文章目录 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.漏洞复现 0x06 修复建议 ​Apache Superset 未授权访问漏洞(CVE-2023-27524)复现 0x01 前言 免责声明&#xff1a;请勿利用文…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...