实验四:搜索

news2025/7/27 12:51:08

实验四:搜索

1.填格子

题目描述

有一个由数字 0、1 组成的方阵中,存在一任意形状的封闭区域,封闭区域由数字1 包围构成,每个节点只能走上下左右 4 个方向。现要求把封闭区域内的所有空间都填写成2

输入要求

每组测试数据第一行一个整数 n(1≤n≤30)

接下来 n 行,由 0 和 1 组成的 n×n 的方阵。

封闭区域内至少有一个0 。

输出要求

已经填好数字 2 的完整方阵。

注意矩阵的每个数字后面都有一个空格

输入样例

6

0 0 0 0 0 0

0 0 1 1 1 1

0 1 1 0 0 1

1 1 0 0 0 1

1 0 0 0 0 1

1 1 1 1 1 1

输出样例

0 0 0 0 0 0

0 0 1 1 1 1

0 1 1 2 2 1

1 1 2 2 2 1

1 2 2 2 2 1

1 1 1 1 1 1

#include <iostream>
#include <queue>
using namespace std;

queue<int>x;//初始化队列x来存储横坐标
queue<int>y;//初始化队列y来存储纵坐标

int matrix[31][31];
int visited[31][31]={0};//visited用来记录元素是否被访问过

int delta_x[4]={0,-1,0,1};//delta_x和delta_y用来进行广搜,来搜索对应元素的上下左右
int delta_y[4]={1,0,-1,0};

int main()
{
    int N;
    cin>>N;
    for(int i=1;i<=N;i++)
    {//从数组的索引1位置开始输入,外圈补一圈0
        for(int j=1;j<=N;j++)
        {
            cin>>matrix[i][j];
        }
    }
    x.push(0);//将(0,0)坐标入队列
    y.push(0);
    visited[0][0]=1;
    
    int x1,y1;
    
    while(!x.empty())
    {
        for(int i=0;i<4;i++)
        {//遍历对应元素的上下左右位置
            x1 = x.front()+delta_x[i];
            y1 = y.front()+delta_y[i];
            //如果满足没有越界且是0元素且没有被访问过
            if(x1>=0 && x1<=N+1 && y1>=0 && y1<=N+1 && matrix[x1][y1]==0 && visited[x1][y1]==0)
            {
                x.push(x1);//则将对应的元素入队
                y.push(y1);
                visited[x1][y1]=1;
            }  
        }
        x.pop();
        y.pop();
    }
	for(int p=1;p<=N;p++) 
    {
		for(int q=1;q<=N;q++) 
         {
			if(visited[p][q]==0 && matrix[p][q]==0)
             {//如果元素没有被访问过,且为0元素
			   cout<<2<<' '; 
			}
			else
             {
			   cout<<matrix[p][q]<<' '; 
			} 
		}
		cout<<endl;
	}
    return 0;
}

2.N皇后

题目描述

N皇后的排列,每行一个不冲突;N<=13。

在这里插入图片描述

输入要求

一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

输出要求

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

解的输出顺序为从上到下从左到右,小的优先输出

输入样例

6

输出样例

2 4 6 1 3 5

3 6 2 5 1 4

4 1 5 2 6 3

4

#include <iostream>
#include <cmath>
using namespace std;
//用result来保存结果,result[i]=p表示棋子放在第i行第p列
int result[15];
//定义一个函数用来判断棋子放在当前行第p列是否合法
int is_place(int p)
{
    for(int i=1;i<p;i++)
    {//对于前面p-1行来说
        if((result[i]==result[p]) || (abs(result[i]-result[p])==abs(i-p)))
        {//不合法情况:在同一列或者在斜线上
            return 0;
        }
    }
    return 1;
}
// 定义函数求解N皇后问题
void Queen(int n)
{
    int p=1,ans=0,count=1;
    result[p]=1;//初始化:从第一行第一列开始放
    while(p>0)
    {
        //对于第p行来说
        if(p<=n && result[p]<=n)
        {
            //如果行列都没有超出矩阵范围
            if(is_place(p)==0)
            {//当前列不合法
                result[p]=result[p]+1;//放到下一个位置
            }
            else
            {//当前列合法
                p=p+1;//到下一列去
                result[p]=1;//下一列从1开始
            }
        }
        else
        {//如果行列超出了索引范围,回溯
            if(p>n)
            {//得到一个正确答案
                ans=ans+1;//正确答案数目加1
                if(count<=3)
                {
                    for(int j=1;j<n;j++)
                    {//输出一条正确答案
                    	cout<<result[j]<<" ";
                    }
                    cout<<result[n];
                    cout<<endl;
                    count++;
                }
            }
            p=p-1;//回到上一行
            result[p]=result[p]+1;//上一行的棋子往右走
        }
    }
    cout<<ans<<endl;
}
int main() 
{
	int N;
	cin>>N;
	Queen(N);
	return 0;
}

3.再填格子

题目描述

有一个由数字 0、1 组成的方阵中,存在一任意形状的封闭区域,封闭区域由数字1 包围构成,每个节点只能走上下左右 4 个方向。现要求只把**【最大封闭区域】**内的空间填写成2 。

例如: 6×6 的方阵:

6
0 1 0 0 0 0
1 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

填写后如下:

0 1 0 0 0 0
1 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入要求

每组测试数据第一行一个整数 n(1≤n≤30)

接下来 n 行,由 0 和 1 组成的 n×n 的方阵。

封闭区域内至少有一个0,测试数据保证最大区域只有一个。

输出要求

已经填好数字 2 的完整方阵。(每个数字后面有一个空格!)

输入样例

6
0 1 0 0 0 0
1 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出样例

0 1 0 0 0 0
1 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

#include<iostream>
#include<cstring>
 
using namespace std;
int a[40][40]; 
int n;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};  // 右 左 下 上 
int cnt = 0;  // 某一个封闭区域的大小 
int maxn = 0;  // 最大封闭区域大小
int id = 3;  // 染色区域的编号
int max_id = id;
void dfs(int x, int y)
{
	if(x<0 || x>n+1 || y<0 || y>n+1 || a[x][y]!=0)  //禁止染色的判断 x<0 || x>n+1 || y<0 || y>n+1为矩阵4个边
		return ;
	a[x][y] = id;  //染色
	cnt++;
	for(int i=0; i<4; i++)
    {
		dfs(x+dir[i][0], y+dir[i][1]);
	} 
}
int main()
{
	cin >> n;
	memset(a, 0, sizeof(a)); 
	int i;
	// 输入数据 
	for( i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
         {
			int k;
			cin >> k;
			a[i][j] = k;
		}
	//将边缘的0和其连接块都染色
	dfs(0, 0);
	id++;
	
	for( i=2; i<n; i++)
		for(int j=2; j<n; j++)
         {
			cnt = 0;
			// 搜索每一个元素,找到最大封闭区域 
			dfs(i, j);
			//cout << cnt;
			if(cnt > maxn)
             {
				maxn = cnt;
				max_id = id;
			}
			id++;
		}
// 输出	
for( i=1; i<=n; i++)
{
		for(int j=1; j<=n; j++)
         {
			if(a[i][j] == 1)
				cout << a[i][j] << " ";
			else if(a[i][j] != max_id)
				cout << '0' << " ";
			else 
				cout << '2' << " ";
 
		}	
		cout << endl;
	}
	return 0;
}

4.地图着色

题目描述

地图着色问题:如果把每一个区域收缩为一个顶点,把相邻两个区域用一条边相连接,就可以把一个区域图抽象为一个平面图。用m种颜色为图中的每个顶点着色,要求每个顶点着一种颜色,并使相邻两顶点之间有着不同的颜色。运用回溯法解决该问题。

输入要求

顶点数 颜色数

邻接矩阵

输出要求

着色方案

输入样例

在这里插入图片描述

输出样例

在这里插入图片描述

#include<iostream>
#include<stdio.h>
using namespace std;
int c[100][100]; //邻接矩阵
int color[100];  //记录每个顶点的颜色
int count,m,n; //count记录方案数 n个顶点 m种颜色
int Check(int k)    //检查第i个顶点的颜色是否满足条件
{
	for(int i=1;i<=k;i++)
		{
			if(c[k][i]==1&&color[i]==color[k]) //k与i之间相连并且i顶点的颜色与k顶点的颜色相同
			return 0;
		}
	return 1;
}
void GraphColor(int step)
{
	if(step==n+1)  //表示前面所有的顶点颜色都已经填完
	{
		for(int i=1;i<=n;i++)
			printf("%d ",color[i]);
		count++;
		printf("\n");
		return ;
	}
	else
	{
		for(int i=1;i<=m;i++)
		{
			color[step]=i;   //首先将这个顶点颜色换为i
			if(Check(step)==1)  //检查是否符合条件
			{
				GraphColor(step+1); //符合条件则走下一步
			}
			color[step]=0;  //回溯 置为0
		}
	}
}
int main(void)
{
	printf("请输入顶点数:");
	scanf("%d",&n);
	printf("\n");
	printf("请输入颜色数:");
	scanf("%d",&m);
	printf("\n");
	printf("请输入邻接矩阵:\n");
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
				cin>>c[i][j];
		}
    printf("\n方案如下:\n");
	GraphColor(1);
	printf("\n");
	printf("%d",count);
	return 0;
}

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

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

相关文章

Provisioning Edge Inference as a Service via Online Learning 阅读笔记

通过在线学习提供边缘推理服务 一、论文研究背景、动机和主要贡献 研究背景 趋势&#xff1a;机器学习模型训练从中央云服务器逐步转移到边缘服务器 好处&#xff1a; 与云相比&#xff1a;a.低延迟 b.保护用户隐私&#xff08;数据不会上传到云&#xff09;与on-device相…

如何理解元数据、数据元、元模型、数据字典、数据模型这五个的关系?如何进行数据治理呢?数据治理该从哪方面入手呢?

如何理解元数据、数据元、元模型、数据字典、数据模型这五个的关系&#xff1f;如何进行数据治理呢&#xff1f;数据治理该从哪方面入手呢&#xff1f;导读一、数据元二、元数据三、数据模型四、数据字典五、元模型导读 请问元数据、数据元、数据字典、数据模型及元模型的区别…

数仓治理之数据梳理

目录 1.定义 2.用途作用 3.实施方法 3.1自上而下 3.1.1数据域梳理 3.1.2数据主题梳理 3.1.3 数据实体梳理 3.1.4设计数据模型 3.1.5优点 3.1.5缺点 3.2自下而上 3.2.1需求分析 3.2.2展现 3.2.3分析逻辑 3.2.4数据建模 3.2.5优点 3.2.6缺点 1.定义 “数据梳理”即对…

SpringBoot 如何保证接口安全?

为什么要保证接口安全对于互联网来说&#xff0c;只要你系统的接口暴露在外网&#xff0c;就避免不了接口安全问题。 如果你的接口在外网裸奔&#xff0c;只要让黑客知道接口的地址和参数就可以调用&#xff0c;那简直就是灾难。举个例子&#xff1a;你的网站用户注册的时候&am…

【云原生kubernetes】k8s数据存储之Volume使用详解

目录 一、什么是Volume 二、k8s中的Volume 三、k8s中常见的Volume类型 四、Volume 之 EmptyDir 4.1 EmptyDir 特点 4.2 EmptyDir 实现文件共享 4.2.1 关于busybox 4.3 操作步骤 4.3.1 创建配置模板文件yaml 4.3.2 创建Pod 4.3.3 访问nginx使其产生访问日志 4.3.4 …

I.MX6ULL_Linux_系统篇(27) 系统烧录工具

前面我们已经移植好了 uboot 和 linux kernle&#xff0c;制作好了根文件系统。但是我们移植都是通过网络来测试的&#xff0c;在实际的产品开发中肯定不可能通过网络来运行&#xff0c;因此我们需要将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子上的…

Nginx学习 (2) —— 虚拟主机配置

文章目录虚拟主机原理域名解析与泛域名解析&#xff08;实践&#xff09;配置文件中ServerName的匹配规则技术架构多用户二级域名短网址虚拟主机原理 为什么需要虚拟主机&#xff1a; 当一台主机充当服务器给用户提供资源的时候&#xff0c;并不是一直都有很大的用户量&#…

数据库面试题总结——DBA面试battle指南

目录 前言 数据库复制 oracle和pg的同步原理 mysql的同步原理 mysql的GTID 主从架构如何保证数据不丢失 oracle的保护模式 pg的日志传输模​​​​​​​式 mysql同步模式 从库只读 oracle的只读 pg的只读 mysql的只读 索引结构和寻迹 B树索引 索引寻迹 绑定执…

nacos源码入门

nacos官方文档地址&#xff1a;nacos官方文档 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说&#xff0c;nacos就是一个注册中心、配置中心&#xff0…

灯具照明行业MES系统,助力企业实现数字化转型

灯具照明行业在制造领域&#xff0c;是典型的高科技离散生产制造模式&#xff0c;大部分企业都设置&#xff1a;电源组件、光源组件、或光电一体组件 &#xff0c;工艺以SMT、DIP等。 灯罩主要采用吸塑工艺及模具加工&#xff1b;其它金属的面盖、灯体、灯盒基本都是采用压铸、…

传送点遍历分析

由于《天涯明月刀》的地图较大&#xff0c;所以每个地图中会分布很多的传送点&#xff0c;而这些传送点都可以在访问过地图之后以“御风神行”这类技能进行传送。为了能够很好的利用这类技能&#xff0c;提高外挂的效率&#xff0c;传送点的遍历是必不可少的。 首先找一个可以…

代码随想录算法训练营第七天|454.四数相加II 、 383. 赎金信 、 15. 三数之和 、18. 四数之和

454.四数相加II 454.四数相加II介绍给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a;思路因为是存放在数组里不同位置的元素&#xff0c;因此不需要考虑去重的操作&#xff0c;而…

深度学习算法简要总结系列

今天突发奇想&#xff0c;准备一个总结系列&#xff0c;以备面试只需&#xff0c;嘿嘿&#xff0c;忘了就回来看看&#xff0c;以框架流程为主&#xff0c;不涉及细节、 点云 pointnet 代码仓库 https://github.com/yanx27/Pointnet_Pointnet2_pytorch 参考博客 论文阅读笔记 …

java单元测试批处理数据模板【亿点点日志配合分页以及多线程处理】

文章目录引入相关资料环境准备分页查询处理&#xff0c;减少单次批量处理的数据量级补充亿点点日志&#xff0c;更易观察多线程优化查询_切数据版多线程_每个线程都分页处理引入 都说后端开发能顶半个运维&#xff0c;我们经常需要对大量输出进行需求调整&#xff0c;很多时候…

Umi + React + Ant Design Pro 项目实践(一)—— 项目搭建

学习一下 Umi、 Ant Design 和 Ant Design Pro 从 0 开始创建一个简单应用。 首先&#xff0c;新建项目目录&#xff1a; 在项目目录 D:\react\demo 中&#xff0c;安装 Umi 脚手架&#xff1a; yarn create umi # npm create umi安装成功&#xff1a; 接下来&#xff0c;…

《OpenGL宝典》--纹理

文章目录创建并初始化纹理创建纹理更新纹理数据纹理目标和类型从着色器中读取纹理数据采样器类型使用texelFetch内置函数从着色器读取纹理使用texture&#xff08;&#xff09;函数从着色器读取纹理获取更多信息控制纹理数据的读取方式使用采样器对象存储采样器包装和过滤模式的…

AVL树的介绍和实现

我们知道&#xff0c;二叉搜索树是会出现单向的。单向在查找时效率是非常低的&#xff0c;时间复杂度会退化成O(N)&#xff0c;而AVL树就是解决这个问题。 文章目录1. AVL 树1.1 AVL树的概念1.2 AVL树节点的定义1.3 插入后的平衡因子1.4 AVL树的旋转1.4.1 右右&#xff1a;左单…

JavaScript 循环实例集合

文章目录JavaScript 循环实例集合For 循环循环输出 HTML 标题While 循环Do while 循环break 语句continue 语句使用 For...In 声明来遍历数组内的元素JavaScript 循环实例集合 For 循环 源码 <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

PG数据库入门知识

前言 Linux和windows的路劲分隔符是不同的&#xff0c;Linux下是斜杠/,而windows是反斜杠&#xff08;\&#xff09;。但在PG里window下也要使用linux的/作为路劲分隔符。 基础知识 为什么选择PG PostgreSQL是一款企业级关系型数据库管理系统。PostgreSQL之所以如此特别&am…

如何成为程序员中的牛人/高手?

目录 一、牛人是怎么成为牛人的&#xff1f; 二、关于牛人的一点看法 三、让程序员与业务接壤&#xff0c;在开发团队中“升级” 四、使用低代码平台 目标效果 五、最后 祝伟大的程序员们梦想成真、码到成功&#xff01; 一、牛人是怎么成为牛人的&#xff1f; 最近在某…