HNU-人工智能-实验2-简单CSP问题

news2024/11/16 12:54:03

人工智能-实验2

计科210x 甘晴void
在这里插入图片描述

一、实验目的

  • 求解约束满足问题

  • 使用回溯搜索算法求解八皇后问题

二、实验平台

  • 课程实训平台https://www.educoder.net/paths/369

三、实验内容

3.0 题目要求

回溯搜索算法

搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。

回溯是搜索算法中的一种控制策略

基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。

编程要求

在右侧编辑器中完成void searchh(int i)函数,求出八皇后问题共有多少种算法。

测试说明

平台会对你编写的代码进行测试:

预期输出:92

3.1 A*算法原理

  1. 递归搜索:从第一行开始,逐行放置皇后,每行放置一个皇后,直到所有皇后都被放置。
  2. 选择合适位置:对于当前行的每一列,检查是否能够放置皇后。如果当前位置合法(不与已放置皇后冲突),则放置皇后,继续递归地处理下一行。
  3. 回溯选择:如果当前位置无法放置皇后,说明之前的选择不正确,需要回溯到上一步重新选择位置。
  4. 标记冲突位置:为了避免皇后之间的冲突,需要用数组 bcd 来标记已经放置的皇后位置所占据的列和对角线。
  5. 结束条件:当成功放置了八个皇后(即当前行数达到 8)时,找到了一组解,计数器增加,并返回上一层继续搜索其他解。

3.2 算法实现

  1. searchh 函数中的参数 i 表示当前处理的行数。
  2. for 循环中,对于当前行的每一列,都尝试放置一个皇后。
  3. 在放置皇后时,通过检查数组 b,c,d来判断当前位置是否合法:
    • b[j] 表示第 j 列是否已经有皇后;
    • c[i+j] 表示主对角线是否已经有皇后;
    • d[i-j+7] 表示副对角线是否已经有皇后。
  4. 如果当前位置合法,则标记相应列和对角线已经有皇后,并递归地处理下一行。
  5. 如果放置完八个皇后,即 i == 8,则找到了一个解,计数器 sum 自增。
  6. 在回溯时,需要将相应列和对角线的标记清除,以便重新尝试其他位置放置皇后。

3.3 源码&分析

#include<iostream>
using namespace std;
int a[9];
int b[9]={0};
int c[16]={0};
int d[16]={0};
int sum=0;

void searchh(int i)
{
    for(int j=1;j<=8;j++)
    {
        if((!b[j])&&(!c[i+j])&&(!d[i-j+7]))//每个皇后都有八个位置(列)可以试放
        {
            /********** Begin **********/
            if (i == 8)
            {
                sum++;
                return;
            }
            b[j] = 1;
            c[i+j] = 1;
            d[i-j+7] = 1;
            searchh(i+1);
            b[j] = 0;
            c[i+j] = 0;
            d[i-j+7] = 0;
            
            /********** End **********/
        }
    }
}

3.4 结果分析

该题默认解决的是八皇后问题,所以确定n=8,结果为92,是固定的。若要实现n皇后问题,则同步扩大数组的大小,同样将得到正确的答案。

3.5 实验难点

本实验比较难理解的地方有以下两点

①注释缺失,难摩题意

给出的代码没有注释,有种让人做完形填空的美感。但是好在题目不是很难,看几遍也可以理解数组的含义。但是如果有注释,就能更加方便理解。

②参数不明,难以测试

调用算法的main函数没有给出,所以i的含义就很难猜出来。这导致我还要通过尝试来获取i的意思,给理解增加了难度。如果能把main函数给出,或者至少告诉我i的含义,会更好。

3.6 实验总结

本次实验还是比较基础的,使用回溯法解决了一个八皇后问题。再次锻炼了我对于回溯法的掌握以及深度优先算法的掌握。

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

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

相关文章

C#知识|如何在WinForm窗体中实现分割线绘制?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在上位机UI设计中经常会用到分割线&#xff0c;用来分割界面区域。 像在KingSCADA、杰控、昆仑通态、WinCC、组态王、力控、易控等组态软件中非常简单&#xff0c;有现成的划线操作&#xff0c;选中相关工具直接绘制即…

一文看懂卷积神经网络CNN(2)—卷积神经网络

目录 一、卷积 1、卷积的定义 &#xff08;1&#xff09;一维卷积 &#xff08;2&#xff09;二维卷积 2、互相关 3、互相关和卷积的区别 4、卷积的变种 5、卷积的数学性质 &#xff08;1&#xff09;交换性 &#xff08;2&#xff09;导数 二、卷积神经网络 1、卷…

Linux 内核简介

操作系统简介 操作系统概念&#xff1a;操作系统处于硬件和应用程序的中间层&#xff0c;控制和管理整个计算机系统的硬件和软件资源&#xff0c;提供给用户和其他软件方便的接口和环境&#xff0c;它是计算机系统的最基本的系统软件。 操作系统功能: 处理机管理存储器管理设…

基于Springboot的房屋租赁管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房屋租赁管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

01 JVM -- JVM 体系结构、HotSpot

1. JVM、HotSpot、 OpenJDK 的区别 JVM (Java Virtual Machine) 是一个虚拟机HotSpot 是 JVM 规范的一个实现。HotSpot 虚拟机通过即时编译 (JIT) 技术将 Java 字节码转换为本地机器码&#xff0c;以提高程序的执行效率。OpenJDK 是一个项目名&#xff0c;它在 HotSpot 的基础…

puzzle(1041)植此青绿、拼图迷宫

目录 植此青绿 简单模式 困难模式 拼图迷宫 核心规则 中级模式具体规则 十字的交叉点 十字的端点、L的交叉点 L的端点 直线、矩形 U的端点 中级模式精选关卡 基本策略 高级模式具体规则 Z形状 T形状 高级模式精选关卡 植此青绿 最强大脑同款项目。 给出7个正…

JavaEE企业级开发中常用的JDK7和JDK8的时间类

JDK7时间类 全世界的时间有一个统一的计算标准 在同一条经线上的时间是一样的 格林威治时间 简称GMT 计算核心 地球自转一天是24小时 太阳直射正好是12小时 但是误差太大 现在用原子钟来代替 用铯原子震动的频率来计算时间&#xff0c;作为世界的标准时间UTC 中国标准时间…

开源版本管理系统的搭建二:SVN部署及使用

作者&#xff1a;私语茶馆 1. Visual SVN Server部署 SVN Server部署包括&#xff1a; 创建版本仓库创建用户 这些部署是通过VisualSVN Server Manager实现的&#xff0c;如下图&#xff1a; VisualSVN Server Manager&#xff08;安装后自带&#xff09; 1.1.SVN 初始化配…

流畅的Python阅读笔记

五一快乐的时光总是飞快了&#xff0c;不知多久没有拿起键盘写文章了&#xff0c;最近公司有Python的需求&#xff0c;想着复习下Python吧&#xff0c;然后就买了本Python的书籍 书名&#xff1a; 《流畅的Python》 下面是整理的一个阅读笔记&#xff0c;大家自行查阅&#xf…

ROS专栏—基于STM32F103的INA219电源数据采集

一、专栏介绍 这篇博客为ROS小车专栏的第一篇&#xff0c;自己想要做一个ROS小车&#xff0c;同时通过CSDN平台记录我的制作过程&#xff0c;为后来者提供一些参考吧&#xff0c;恩我也是从零开始摸索&#xff0c;可能会有很多错误和问题&#xff0c;希望大家多多包涵。 二、…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…

数据结构十:哈希表

本次将从概念上理解什么是哈希表&#xff0c;理论知识较多&#xff0c;满满干货&#xff0c;这也是面试笔试的一个重点区域。 目录 一、什么是哈希表 1.0 为什么会有哈希表&#xff1f; 1.1 哈希表的基本概念 1.2 基本思想 1.3 举例理解 1.4 存在的问题 1.5 总结 二、…

基于TL431基准电压源的可调恒压恒流源的Multisim电路仿真设计

1、线性电源的工作原理 在我们日常应用里&#xff0c;直流电是从市电或电网中的交流电获取的。例如15V直流电压源、24V直流电压源等等。交流电变为直流电的过程大概分为一下几步&#xff1a; 首先&#xff0c;交流电通过变压器降低其电压幅值。接着&#xff0c;经过整流电路进…

01_SpringBoot简单搭建入门程序

目录 1、先创建一个java项目2、导入依赖3、将Java项目修改为SpringBoot项目4、编写一个测试的Controller5、测试(创建一个*.http的文件)方式1&#xff1a;方式2&#xff1a;可以直接在浏览器访问该地址方式3&#xff1a;使用postman也可以 1、先创建一个java项目 我的项目结构…

智能化工单助力业务运作:亿发解析工单系统的功能与适用场景

在现代企业管理中&#xff0c;工单系统扮演着至关重要的角色。面对市面上众多的工单系统&#xff0c;我们可以根据不同的依据进行分类&#xff0c;以更好地满足企业的需求。 1、按部署方式分类&#xff1a; 按照部署方式可以分为本地化部署工单系统和云端SaaS服务工单系统。 …

步态识别论文(6)GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation

摘要: 视角变化导致步态外观存在显着差异。因此&#xff0c;识别跨视图场景中的步态是非常具有挑战性的。最近的方法要么在进行识别之前将步态从原始视图转换为目标视图&#xff0c;要么通过蛮力学习或解耦学习提取与相机视图无关的步态特征。然而&#xff0c;这些方法有许多约…

【java9】java9新特性之Optional类改进

其实Optional类在Java8中就引入了&#xff0c;用于避免null检查和NullPointerException指针问题。 在Java9中&#xff0c;Optional类得到了进一步的改进&#xff0c;增加了一些新的方法&#xff0c;使其更加灵活和易用。 以下是一些Java9中对Optional类的改进&#xff1a; s…

ssm106学生公寓管理系统的设计与实现+jsp

学生公寓管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生公寓管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

python数据分析——数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤4.1.点估计4.2.区间估计4.2.1. 总体方差已知4.2.2总体方差未知 4.3. 假设检验4.4. 假设检验的假设4.5.显著性水平 五、检验统计量六、检验方法七、拒绝域八、假设检验步骤九、重要假设检验方法…

CGAL 网格简化

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 为了提高网格处理的效率,通常需要将过于冗长的3D数据集简化为更简洁而又真实的表示。尽管从几何压缩到逆向工程有许多应用,但简洁地捕捉表面的几何形状仍然是一项乏味的任务。CGAL中则为我们提供了一种通过变分几…