算法学习系列(五):N皇后、数独

news2024/11/25 18:25:58

目录

  • 引言
  • 一、N皇后问题
    • 代码实现
    • 测试
  • 二、数独问题
    • 代码实现
    • 测试

引言

这个N皇后问题是很典型的一个递归问题,就是还是要掌握,所谓递归其实就是dfs,一层一层深入下去。数独和N皇后的思路是一样的,只不过一些细节不同而已。

一、N皇后问题

首先介绍一下八皇后问题,那么N皇后就是N*N个棋盘里,放入N个棋子,要求同行同列同斜线不能有重复的棋子
在这里插入图片描述

代码实现

这个思路就是暴力枚举,从第一行第一列开始,如果满足要求就落棋子,接着进入下一行,如果一直到了第n+1行说明前n行都满足要求,说明符合情况,就次数加一,然后把该情况打印一下。如果该行结束了,那么就回退到上一行中,把之前落得棋子拾起来,然后再判断下一列是否能够放棋子,一直到第一行结束。
跟下图的思想是一样的,唯一不同的是第二行条件不满足的时候,就进入下一列而不进入下一层
在这里插入图片描述

#include<iostream>

using namespace std;

const int N = 10;
int g[N][N];  //0代表不落棋子,1代表落棋子
int n, cnt;
int dir[3][2] = { -1,-1, -1,0, -1,1 };  //代表方向,分别是左上、上、右上

bool check(int row, int col)
{
	for (int i = 0; i < 3; ++i)
	{
		int x = row, y = col;
		while (1)
		{
			x += dir[i][0];
			y += dir[i][1];
			if (x < 0 || x >= n || y < 0 || y >= n) break;
			if (g[x][y]) return false;
		}
	}

	return true;
}

void dfs(int row)
{
	if (row >= n)
	{
		cnt++;
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				printf("%d ", g[i][j]);
			}
			puts("");
		}
		puts("");
	}

	for (int j = 0; j < n; ++j)
	{
		if (check(row, j))
		{
			g[row][j] = 1;
			dfs(row + 1);
			g[row][j] = 0;
		}
	}
}

int main()
{
	cin >> n;
	dfs(0);

	return 0;
}

测试

输入4可以看出是正确的
在这里插入图片描述
输入10,并把输出信息改为最后输出cnt,所得结果也是正确的
在这里插入图片描述

二、数独问题

9*9的格子里,填充数字1~9,要求同行同列不能重复,同一个田字格也不能重复

代码实现

#include<iostream>

using namespace std;

int g[9][9] = { 0,0,5,3,0,0,0,0,0,
				8,0,0,0,0,0,0,2,0,
				0,7,0,0,1,0,5,0,0,
				4,0,0,0,0,5,3,0,0,
				0,1,0,0,7,0,0,0,6,
				0,0,3,2,0,0,0,8,0,
				0,6,0,5,0,0,0,0,9,
				0,0,4,0,0,0,0,3,0,
				0,0,0,0,0,9,7,0,0 };  //0代表没放 1~9代表放的该数字
int cnt;

bool check(int row, int col, int num)
{
	if (g[row][col]) return false;
	for (int i = 0, j = col; i < 9; ++i)
	{
		if (g[i][j] == num) return false;
	}

	for (int i = row, j = 0; j < 9; ++j)
	{
		if (g[i][j] == num) return false;
	}

	int x1 = row / 3 * 3, y1 = col / 3 * 3;
	for (int i = x1; i < x1 + 3; ++i)
	{
		for (int j = y1; j < y1 + 3; ++j)
		{
			if (g[i][j] == num) return false;
		}
	}

	return true;
}

void dfs(int row, int col)
{
	if (row >= 9)
	{
		cnt++;
		for (int i = 0; i < 9; ++i)
		{
			for (int j = 0; j < 9; ++j)
			{
				printf("%d ", g[i][j]);
			}
			puts("");
		}
		puts("");
		return;
	}

	if (g[row][col] == 0)
	{
		for (int num = 1; num <= 9; ++num)
		{
			if (check(row, col, num))
			{
				g[row][col] = num;
				dfs(row + (col + 1) / 9, (col + 1) % 9);
				g[row][col] = 0;
			}
		}
	}
	else
	{
		dfs(row + (col + 1) / 9, (col + 1) % 9);
	}
}

int main()
{
	dfs(0,0);
	//0 1 2   3 4 5   6 7 8

	return 0;
}

测试

可以看出来是正确的
在这里插入图片描述

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

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

相关文章

【恋上数据结构】前缀树 Tire 学习笔记

Tire 需求分析 如何判断一堆不重复的字符串是否以某个前缀开头&#xff1f; 用 Set\Map 存储字符串&#xff08;不重复&#xff09;遍历所有字符串进行判断缺点&#xff1a;时间复杂度 O(n) 有没有更优的数据结构实现前缀搜索&#xff1f; Tire&#xff08;和 Tree 同音&a…

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Unity-Shader - 2DSprite描边效果

实现一个简单的2D精灵图描边效果&#xff0c;效果如下 实现思路&#xff1a; 可以通过判断该像素周围是否有透明度为 0的值&#xff0c;如果有&#xff0c;则说明该像素位于边缘。 所以我们需要打开alpha blend&#xff0c;即&#xff1a; Blend SrcAlpha OneMinusSrcAlpha&am…

腾讯云轻量应用服务器怎么使用宝塔面板?

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

Apache或Nginx在Linux上配置虚拟主机

在Linux上使用Apache或Nginx配置虚拟主机可以让您在同一台服务器上托管多个网站。这样不仅可以充分利用服务器资源&#xff0c;还能降低每个网站的运营成本。以下是使用Apache和Nginx配置虚拟主机的步骤。 使用Apache配置虚拟主机 安装Apache服务器软件。在终端中使用以下命令…

网络安全(三)-- 网络嗅探及协议分析技术

目标 了解网络嗅探的基本含义了解tcpdump工具的基本用法掌握tcpdump工具抓包保存到文件的方法熟悉wireshark工具的基本用法掌握借助wireshark抓包工具分析简单网络协议的方法 6.1. 概述 网络嗅探是一种常用的数据收集、分析的方法: 黑客常通过网络嗅探获取主机或网络的控制权…

资料分析(花生)

基期A&#xff08;给出BR或BX&#xff09; 前期&#xff1a;代入、直除、假设分配隔年前期&#xff1a;求出间隔增长率&#xff0c;再变成第一类考法前期差值&#xff1a;假设分配法求得两个前期作差。 现期B 有增量求现期&#xff1a;求出 X&#xff0c;列不等式即可有增速求现…

uniapp 使用 $emit和$on——$on中无法为data中的变量赋值

问题在于this的指向&#xff0c; 解决办法是使用变量保存$on&#xff0c;其次再为data中的值赋值 以下是具体代码&#xff1a; 1、html代码&#xff1a; <view class"form_picker" click"selePositionFun()"><view class""><inp…

Leetcode 77 组合

题意理解&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 如&#xff1a;n3,k2,则有&#xff1a;12 13 23 一般&#xff0c;我们使用回溯法来解决组合问题。 组合问题没有顺序要求&#xff0c;所以 12 21 是同一个组合&#xff08;如…

centos7安装Elasticsearch7系列

背景 今天公司项目需要使用Elasticsearch7.17.7。所有网上搜索了一番&#xff0c;查到一个很不错安装方式分享给大家。 Elasticsearch官网发布 从 Elasticsearch 7.x 版本开始&#xff0c;Elasticsearch 发行版包括了自己的 JDK。因此&#xff0c;您不需要单独安装 Java。以…

Android View.inflate 和 LayoutInflater.from(this).inflate的区别

前言 两个都是布局加载器&#xff0c;而View.inflate是对 LayoutInflater.from(context).inflate的封装&#xff0c;功能相同&#xff0c;案例使用了dataBinding。 View.inflate(context, layoutResId, root) LayoutInflater.from(context).inflate(layoutResId, root, fals…

CLIP在Github上的使用教程

CLIP的github链接&#xff1a;https://github.com/openai/CLIP CLIP Blog&#xff0c;Paper&#xff0c;Model Card&#xff0c;Colab CLIP&#xff08;对比语言-图像预训练&#xff09;是一个在各种&#xff08;图像、文本&#xff09;对上进行训练的神经网络。可以用自然语…

JS箭头函数

箭头函数 1. 基本语法 // // 一般函数const fn function() {console.log(123);}// 箭头函数const fn () > {console.log(123);}fn()const fn (x) > {console.log(x);}fn(1)// 只有一个形参的时候可以省略小括号const fn x > {console.log(x);}fn(1)// 只有一行代…

基于c++版本链队列改-Python版本链队列基础理解

##基于链表的队列实现 可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”&#xff0c;规定队尾仅可添加节点&#xff0c;队首仅可删除节点。 ##图解 ##基于链表的队列实现代码 class ListNode:"""定义链表"""def __init__(self)…

nodejs微信小程序+python+PHP本科生优秀作业交流网站的设计与实现-计算机毕业设计推荐

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将本科生优秀作业交流网站功能模块主要分为管理员模块。管理员添加系统首页、个人中心、用户管理、作业分类管理、作业分享管理、论坛交流、投诉举报、系统管理等操作。 随着信息化社会的形成…

Mybatis XML 配置文件

我们刚开始就有说Mybatis 的开发有两种方式: 1.注释 2.XML 注解和 XML 的方式是可以共存的 我们前面说的都是注释的方式,接下来是XML方式 XML的方式分为三步 : 1.配置数据库(配在 application.yml 里面) 这个跟注释的配置是一样的,username应该都是一样的,password记得写…

git常用命令指南

目录 一、基本命令 1、创建分支 2、切换分支 3、合并分支 4、初始化空git仓库 二、文件操作 1、创建文件 2、添加多个文件 3、查看项目的当前状态 4、修改文件 5、删除文件 6、提交项目 三、实际操作 1、创建目录 2、进入新目录 3、初始化空git仓库 4、创建文…

【OpenGauss源码学习 —— (RowToVec)算子】

VecToRow 算子 概述ExecInitRowToVec 函数ExecRowToVec 函数VectorizeOneTuple 函数 ExecEndRowToVec 函数总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在…

使用AWS Glue与AWS Kinesis构建的流式ETL作业(二)——数据处理

大纲 2 数据处理2.1 架构2.2 AWS Glue连接和创建2.2.1 创建AWS RedShift连接2.2.2 创建AWS RDS连接&#xff08;以PG为例&#xff09; 2.3 创建AWS Glue Job2.4 编写脚本2.4.1 以AWS RedShift为例2.4.2 以PG为例 2.5 运行脚本 2 数据处理 2.1 架构 2.2 AWS Glue连接和创建 下…