1.26学习总结

连通性判断

DFS连通性判断步骤:

1.从图上任意一点u开始遍历,标记u已经走过

2.递归u的所有符合连通条件的邻居点

3.递归结束,找到了的所有与u的连通点,就是一个连通块

4.然后重复这个步骤找到所有的连通块

BFS连通性判断步骤:

1.从图上任意一点u开始遍历,入队

2.弹出队首u,并且u已经被标记过,开始搜索u的邻居点放到队列中

3.弹出队首,重复步骤寻找连通点

题:全球变暖

你有一张某海域 ���NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:

.......

.##....

.##....

....##.

..####.

...###.

.......

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......

.......

.......

.......

....#..

.......

.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入

第一行包含一个整数 N (1≤N≤1000)。

以下 �N 行 �N 列代表一张海域照片。

照片保证第 1 行、第 1 列、第 �N 行、第 �N 列的像素都是海洋。、

输出一个整数表示答案。

这道题,主要是通过找到第一个陆地,然后遍历整个岛屿,判断其中是否存在高低,如果有则这个岛屿就不会被淹没

1.DFS

#include <bits/stdc++.h>
using namespace std;
const int N=1010;
char mp[N][N];
int vis[N][N];
int flag;
void dfs(int x,int y)
{
	vis[x][y]=1;
	int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
	if(mp[x][y]=='.')return;
	if (mp[x+1][y]=='#' && mp[x][y+1]=='#' && mp[x-1][y]=='#' && mp[x][y-1]=='#')flag=1;
	for (int i=0;i<4;++i)
	{
		int  tx=x+dir[i][0],ty=y+dir[i][1];
		if (vis[tx][ty]==0 && mp[tx][ty]=='#')
			dfs(tx,ty);
	}
}
int main()
{
	int n;
	cin>>n;
	for (int i=0;i<n;++i)
	{
		cin>>mp[i];
	}
	int ans=0;
	for (int i=0;i<n;++i)
	{
		for (int j=0;j<n;++j)
		{
      if (mp[i][j]=='#' && vis[i][j]==0)
			{flag=0;
      dfs(i,j);
      if (flag==0)ans++;}
		}
	}
	cout<<ans;
}
2.BFS
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
char mp[N][N],flag;
int vis[N][N];
void bfs(int x ,int y)
{
  queue<pair<int, int> > q;
  q.push({x,y});
  vis[x][y]=1;
  int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
  while (q.size())
  {
    pair<int,int>p;
    p=q.front();
    q.pop();
    int tx=p.first,ty=p.second;
    if (mp[tx+1][ty]=='#' && mp[tx][ty+1]=='#' && mp[tx-1][ty]=='#' && mp[tx][ty-1]=='#')flag=1;
    for (int i=0;i<4;++i)
    {
      int nx=tx+dir[i][0],ny=ty+dir[i][1];
      if (mp[nx][ny]=='#' && vis[nx][ny]==0)
      {
        vis[nx][ny]=1;
        q.push({nx,ny});
      }
    }
  }
}
int main()
{
  int n;
  cin>>n;
  int ans=0;
  for (int i=0;i<n;++i)cin>>mp[i];
  for (int i=0;i<n;++i)
  {
    for (int j=0;j<n;++j)
    {
      if (vis[i][j]==0 && mp[i][j]=='#')
      {
        
        bfs(i,j);
        if (flag==0)ans++;
        flag=0;
      }
    }
  }
  cout<<ans;
}

判重

由于DFS和BFS都是暴力的搜索方法,所以很容易超时,所以DFS需要剪枝,BFS需要判重

题:跳蚱蜢https://www.lanqiao.cn/problems/642/learning/?page=1&first_category_id=1&problem_id=642

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下图所示: 有 99 只盘子,排成 11 个圆圈。 其中 88 只盘子内装着 88 只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 11 ~ 88。

图片描述

每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。

请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列, 并且保持空盘的位置不变(也就是 1−81−8 换位,2−72−7换位,...),至少要经过多少次跳跃?

这道题,就 引入了map来记录经过的字符串,下次在变成这个串的时候就可以直接跳过

#include <bits/stdc++.h>
using namespace std;
struct node{
	node(){}
	node(string ss,int tt){s=ss,step=tt;}
	string s;
	int step;
};
int cnt=0;
queue<node>q;
map<string,bool>mp;
void solve()
{
	while (!q.empty())
	{
		node now=q.front();
		q.pop();
		string s=now.s;
		int step=now.step;
		if (s=="087654321")
		{
			cout<<step<<endl;
			cout<<cnt<<endl;
			break;
		}
		int i;
		for (i=0;i<10;++i)
		{
			if (s[i]=='0')break;
		}
		for (int j=i-2;j<=i+2;++j)
		{
			int k=(j+9)%9;
			if (k==i)continue;
			string news=s;
			char temp=news[i];
			news[i]=news[k];
			news[k]=temp;
			cnt++;
			if (!mp[news])
			{
				mp[news]=true;
				q.push(node(news,step+1));
			}
		}
	}
}
int main()
{
	string s="012345678";
	q.push(node(s,0));
	mp[s]=true;
	solve();
}

剪枝

剪格子https://www.lanqiao.cn/problems/211/learning/?page=1&first_category_id=1&problem_id=211

题目描述

如下图所示,3 x 3 的格子中填写了一些整数。

我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是 60。

本题的要求就是请你编程判定:对给定的 �×�m×n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出 0。

输入描述

输入描述

程序先读入两个整数 �,�m,n 用空格分割 (�,�<10)(m,n<10),表示表格的宽度和高度。

接下来是 �n 行,每行 �m 个正整数,用空格分开。每个整数不大于 104104。

输出描述

在所有解中,包含左上角的分割区可能包含的最小的格子数目。

这道题的思路很简单,就是找到所有格子总和的一半,所以当此时相加的总和超过一半的时候,就可以直接退出,达到剪枝的效果

#include <bits/stdc++.h>
using namespace std;
int a[11][11];
int m,n,sum,minx=100005;
int vis[11][11];
void dfs(int x,int y,int s,int l)
{
	if (s==sum/2 )
	{
		if (minx>l && vis[0][0])minx=l;
		return;	
	}
	if (s>sum/2)return;
	int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
	for (int i=0;i<4;++i)
	{
		int tx=x+dir[i][0],ty=y+dir[i][1];
		if (vis[tx][ty]==1 || tx<0 || ty<0 || tx>=m || ty>=n)continue;
		vis[tx][ty]=1;
		dfs(tx,ty,s+a[tx][ty],l+1);
		vis[tx][ty]=0;
	}
	return ;
}
int main()
{
	cin>>m>>n;
	for (int i=0;i<n;++i)
	{
		for(int j=0;j<m;++j)
		{
			cin>>a[i][j];
			sum+=a[i][j];
		}
	}
	vis[0][0]=1;
	dfs(0,0,a[0][0],1);
	cout<<(minx==100005?0:minx);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL查询数据库环境(dm8达梦数据库)

SQL查询数据库环境dm8达梦数据库 环境介绍 环境介绍 某些环境没有图形化界面,可以使用sql语句查询达梦数据库环境情况 SELECT 实例名称 数据库选项,INSTANCE_NAME 数据库选项相关参数值 FROM V$INSTANCE UNION ALL SELECT 授权用户,(SELECT AUTHORIZED_CUSTOMER FROM V$LICE…

Kafka-服务端-PartitionStateMachine

PartitionStateMachine是Controller Leader用于维护分区状态的状态机。分区的状态是通过PartitionState接口定义的&#xff0c;它有四个子类分别代表了分区四种可能的状态&#xff0c;如表所示。 分区各个PartitionState之间的转换如图所示。 下面分析各个状态之间转换时&#…

梯度下降法、模拟训练、拟合二次曲线、最小二乘法、MSELoss、拟合:f(x)=ax^2+bx+c

本文目标&#xff1a; 以这个公式为例&#xff0c;设计一个算法&#xff0c;用梯度下降法来模拟训练过程&#xff0c;最终得出参数a,b,c 原理介绍 目标函数&#xff1a; 损失函数&#xff1a;&#xff0c;就是mse 损失函数展开&#xff1a; 损失函数对a,b,c求导数: 导数就是梯度…

JavaScript高级:闭包

1 概念 一个函数对周围状态的引用&#xff0c;捆绑在一起&#xff0c;内层函数中可以访问到外层函数的作用域。 简单理解&#xff1a;闭包 内层函数 外层函数的变量 先看个简单的代码&#xff1a; function outer() {let a 1function inner() {console.log(a)} } outer(…

tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行

原文&#xff1a;http://bits-please.blogspot.com/2015/03/getting-arbitrary-code-execution-in.html 目标是什么&#xff1f; 这将是一系列博客文章&#xff0c;详细介绍我发现的一系列漏洞&#xff0c;这些漏洞将使我们能够将任何用户的权限提升到所有用户的最高权限 - 在…

重磅!讯飞星火V3.5马上发布!AI写作、AI编程、AI绘画等功能全面提升!

讯飞星火大模型相信很多友友已经不陌生了&#xff0c;可以说是国内GPT相关领域的龙头标杆&#xff0c;而对于1月30日即将在讯飞星火发布会发出的V3.5新版本来说&#xff0c;讯飞星火V3.5与之前版本相比&#xff0c;性能提升方面相当明显&#xff0c;在提示语义理解、内容生成、…

Java项目:15 springboot vue的智慧养老手表管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统共分为两个角色&#xff1a;家长&#xff0c;养老院管理员 框架&#xff1a;springboot、mybatis、vue 数据库&#xff1a;mysql 5.7&…

【幻兽帕鲁】开服务器,高性能高带宽(100mbps),免费!!!【学生党强推】

【幻兽帕鲁】开服务器&#xff0c;高性能高带宽&#xff08;100mbps&#xff09;&#xff0c;免费&#xff01;&#xff01;&#xff01;【学生党强推】 教程相关视频地址&#xff1a;https://www.bilibili.com/video/BV16e411Y7Fd/ 目前幻兽帕鲁开服务器有以下几套比较性价比的…

【计算机图形学】实验五 一个简单的交互式绘图系统(实验报告分析+截图+源码)

可以先看一看这篇呀~【计算机图形学】专栏前言-CSDN博客https://blog.csdn.net/m0_55931547/article/details/135863062 目录 一、实验目的 二、实验内容

docker-compose部署单机ES+Kibana

记录部署的操作步骤 准备工作编写docker-compose.yml启动服务验证部署结果 本次elasticsearch和kibana版本为8.2.2 使用环境&#xff1a;centos7.9 本次记录还包括&#xff1a;安装elasticsearch中文分词插件和拼音分词插件 准备工作 1、创建目录和填写配置 mkdir /home/es/s…

杰理方案——WIFI连接物联网配置阿里云操作步骤

demo——DevKitBoard 注意:最好用这个Demo,其它Demo可能会有莫名其妙的错误问题。 wifi配置 需要在app_config.h文件中定义USE_DEMO_WIFI_TEST,工程会在wifi_demo_task.c文件中自动启动wifi相关的任务, 我们将工程配置为连接外部网络STA模式 默认工程会使用如下账号密码 这…

go slice 基本用法

slice&#xff08;切片&#xff09;是 go 里面非常常用的一种数据结构&#xff0c;它代表了一个变长的序列&#xff0c;序列中的每个元素都有相同的数据类型。 一个 slice 类型一般写作 []T&#xff0c;其中 T 代表 slice 中元素的类型&#xff1b;slice 的语法和数组很像&…

一款强大的矢量图形设计软件:Adobe Illustrator 2023 (AI2023)软件介绍

Adobe Illustrator 2023 (AI2023) 是一款强大的矢量图形设计软件&#xff0c;为设计师提供了无限创意和畅行无阻的设计体验。AI2023具备丰富的功能和工具&#xff0c;让用户可以轻松创建精美的矢量图形、插图、徽标和其他设计作品。 AI2023在界面和用户体验方面进行了全面升级…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python进⾏网络监控?

如何使⽤Python进⾏⽹络监控&#xff1f; 使⽤Python进⾏⽹络监控可以帮助实时监视⽹络设备、流量和服务的状态&#xff0c;以便及时识别和解决问题。 以下是⼀般步骤&#xff0c;说明如何使⽤Python进⾏⽹络监控&#xff1a; 选择监控⼯具和库&#xff1a;选择适合⽹络监控需…

网络防御——NET实验

一、实验拓扑 二、实验要求 1、生产区在工作时间&#xff08;9&#xff1a;00---18&#xff1a;00&#xff09;内可以访问服务区&#xff0c;仅可以访问http服务器&#xff1b; 2、办公区全天可以访问服务器区&#xff0c;其中&#xff0c;10.0.2.20可以访问FTP服务器和HTTP服…

OSI七层模型 | TCP/IP模型 | 网络和操作系统的联系 | 网络通信的宏观流程

文章目录 1.OSI七层模型2.TCP/IP五层(或四层)模型3.网络通信的宏观流程3.1.同网段通信3.2.跨网段通信 1.OSI七层模型 在计算机通信诞生之初&#xff0c;不同的厂商都生产自己的设备&#xff0c;都有自己的网络通讯标准&#xff0c;导致了不同厂家之间各种协议不兼容&#xff0…

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

Web3创业:去中心化初创公司的崛起

随着Web3时代的到来&#xff0c;去中心化技术的崛起不仅令人瞩目&#xff0c;也为创业者带来了前所未有的机遇。在这个新的时代&#xff0c;一批去中心化初创公司正崭露头角&#xff0c;重新定义着商业和创新的边界。本文将深入探讨Web3创业的趋势&#xff0c;以及去中心化初创…

VScode 好用的插件合集

VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主&#xff0c;让其同…

策略者模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 目录 一 Model 二 View 三 ViewModel 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练…