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

ops/2024/9/23 9:24:55/

人工智能-实验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.ppmy.cn/ops/33638.html

相关文章

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

商城数据库(51 52 53 54 55 56 57 58 59 60)

51 CREATE TABLE sxh_log_sms (smsId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,smsSrc tinyint(4) NOT NULL DEFAULT 0 COMMENT 消息类型(0:系统消息 ,扩散),smsUserId int(11) NOT NULL DEFAULT 0 COMMENT 发现者ID,smsContent varchar(255) NOT NULL COMMENT 短信内…

6.k8s中的secrets资源

一、Secret secrets资源&#xff0c;类似于configmap资源&#xff0c;只是secrets资源是用来传递重要的信息的&#xff1b; secret资源就是将value的值使用base64编译后传输&#xff0c;当pod引用secret后&#xff0c;k8s会自动将其base64的编码&#xff0c;反编译回正常的字符…

面试算法-链表-反转链表(golang、c++)

目录 1、题目 2、解题思路 2.1 遍历、迭代 2.2 递归 3、源代码 3.1 c 3.2 golang 4、复杂度分析 4.1 遍历、迭代法 4.2 迭代法 1、题目 链表是一种常用的数据结构&#xff0c;链表的特点是插入、删除节点的效率非常高&#xff0c;因为他不需要移动其他任何元素&…

一些modbus协议面试题

请简述Modbus协议是什么&#xff0c;以及它主要应用在哪些领域&#xff1f; Modbus协议是一种串行通信协议&#xff0c;用于工业自动化系统中智能设备之间的通信。它广泛应用于工业自动化、智能建筑、电力系统等领域。 Modbus协议支持哪些传输模式&#xff1f;并简述它们之间的…

数据库常问4

表锁和行锁&#xff1f; 表锁&#xff1a; 表锁是对整个表进行加锁&#xff0c;可以分为表共享读锁&#xff08;表读锁&#xff09;和表独占写锁&#xff08;表写锁&#xff09;两种模式。在表级锁中&#xff0c;读锁之间不互斥&#xff0c;但写锁和任何其他锁都互斥。表锁粒…

docker-compose启动mysql5.7报错

描述一下问题经过&#xff1a; 使用docker compose 部署mysql5.7 文件如下: 使用命名卷的情况下&#xff0c;匿名卷不存在该问题 services:mysql:restart: alwaysimage: mysql:5.7container_name: mysql-devports:- 3306:3306environment:- MYSQL_DATABASEdev- MYSQL_ROOT_PAS…

stm32学习笔记(openmv与stm32通信)

在进行OpenMV与STM32的通信学习时&#xff0c;理解UART&#xff08;通用异步接收/发送器&#xff09;的工作原理和正确配置串口参数是至关重要的。以下是一篇关于STM32与OpenMV通信的学习笔记&#xff0c;包括相关代码示例。 1. 引言 OpenMV是一款面向机器视觉的微控制器&…