1.26学习总结

news2024/11/23 22:18:15

连通性判断

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.coloradmin.cn/o/1415849.html

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

相关文章

opencv学习二值分析

内容来源于《opencv4应用开发入门、进阶与工程化实践》 二值分析&#xff1a; 常见的二值化方法&#xff1a; 基于全局阈值&#xff08;threshold&#xff09;得到的二值图像&#xff1b;基于自适应阈值&#xff08;adaptiveThreshold&#xff09;得到的二值图像&#xff1…

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体&#xff09;这种就解决不了&#xff0c;也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中&#xff0c;客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了&#xff0c;主要是因为硕士之后&#xff0c;也就没再继续深入研究这个课题了&#xff0c;更多的是在电科院的项目里会接触。这个课题方向其实作为硕士毕业课题还是够用的&#xff0c;相对来说也是比较容易毕业的&#xff0c;因为涉及的…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言&#xff08;或 Golang&#xff09;是 Google 开发的开源编程语言&#xff0c;诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

Nodejs前端学习Day3_准备工作

妈的&#xff0c;这几天真tm冷&#xff0c;前天上午还下了一整天的雪&#xff0c;大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

Python 中的 strip 函数用法,你真的学会了吗?

Python 提供了大量内置函数&#xff0c;使编程变得更加简单。strip 就是这样一个函数。在本文中&#xff0c;我们将探讨 strip 是什么、为什么有用以及如何有效地使用它。 什么是 strip strip 是一种内置方法&#xff0c;用于删除字符串中的前导字符和尾随字符。这些字符可以…

MYSQL库和表的操作(修改字符集和校验规则,备份和恢复数据库及库和表的增删改查)

文章目录 一、MSYQL库的操作1.连接MYSQL2.查看当前数据库3.创建数据库4.字符集和校验规则5.修改数据库6.删除数据库7.备份和恢复8.查看连接 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、MSYQL库的操作 1.连接MYSQL 我们使用下面的语句来连接MSYQL&#xff1a; my…

太阳能 LED 恒流电源 升降压原理图 AP9193 大功率升压恒流IC

特别 宽输入电压范围&#xff1a;3.6V~100V 高效率&#xff1a;可高达 95% 工作频率&#xff1a;1MHz CS 限流保护电压&#xff1a;250mV FB 电流采样电压&#xff1a;250mV 芯片供电欠压保护&#xff1a;2.5V 关断时间可调 外置频率补偿脚 应用领域 LED 灯杯 电池供…

docker容器运维命令

文章目录 docker psdocker execdocker inspectdocker topdocker attachdocker waitdocker exportdocker importdocker portdocker cpdocker diffdocker renamedocker statsdocker update总结 docker ps 列出容器。 docker ps [OPTIONS]OPTIONS说明&#xff1a; -a :显示所有的…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧&#xff0c;使用 JPEG 标准对其进行压缩&#xff0c;然后通过UDP以太网将其传输到另一个设备&#xff08;例如计算机&#xff09;&#xff0c;所有…

计算方法实验1:熟悉MATLAB 环境

一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能&#xff0c;熟悉Matlab 命令窗口及文件管理&#xff0c;Matlab 帮助系统。掌握命令行的输入及编辑&#xff0c;用户目录及搜索路径的配置。了解Matlab 数据的特点&#xff0c;熟悉Matlab 变量的命名规则&a…

如何独立思考?这里有一份全指南

知乎上有一个问题&#xff0c;叫做&#xff1a;为什么我们要独立思考&#xff1f; 排名第一的回答&#xff0c;是凤凰前主笔王路写的&#xff0c;很有意思。他说&#xff1a; 因为别人告诉我们要独立思考。 这个回答非常妙&#xff0c;也非常反讽&#xff0c;有一种「第22条军规…

32GPIO输入&按键控制LED&光敏控制蜂鸣器

一.硬件 光线越强&#xff0c;光敏电阻的阻值越小 温度越高&#xff0c;热敏电阻的阻值就越小 红外光线越强&#xff0c;红外接收管的阻值就越小 类比&#xff1a;电阻阻值越小&#xff0c;上拉或下拉就越强 &#xff08;弹簧的拉力就越强&#xff09; 在上下的电阻分压下&a…

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart

每次提交代码时&#xff0c;AS这个老妈子总爱唠叨一堆warning&#xff0c;这些Warning都在讲什么&#xff1f; 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中&#xff0c;android:drawableStart和app:drawableStartCompat是两个用于设置…

Linux下的进程操作

进程概念 ps -elf&#xff1a;查看操作系统的所有进程&#xff08;Linux命令&#xff09; ctrl z&#xff1a;把进程切换到后台 crtl c&#xff1a;结束进程 fg&#xff1a;把进程切换到前台 获取进程进程号和父进程号 函数原型&#xff1a; pid_t getpid(void); //pid_t…

2.精确度-机器学习模型性能常用的评估指标

一.精确度的定义 精确度&#xff1a;机器学习领域中一项至关重要的评价指标&#xff0c;其专注于评估模型对正样本的预测准确性。 相对于准确率而言&#xff0c;精确度更为细致&#xff0c;它关注的是模型在将实例预测为正样本的情况下&#xff0c;实际为正样本的比例。换句话…

2024 1.20~1.26周报

一、上周工作 了解注意力机制&#xff0c;开始论文的初步阅读 二、本周计划 简单了解transform架构&#xff0c;继续研读论文U-MixFormer: UNet-like Transformer with Mix-Attention for Efficient Semantic Segmentation。 三、完成情况——论文研读 标题&#xff1a;U-Mi…

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2)

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心&#xff0c;Kotlin&#xff08;2&#xff09; 在 Android ScaleGestureDetector检测双指缩放Bitmap基于Matrix动画移动到双指捏合中心点ImageView区域中心&#xff0c;Kotlin-CSDN博客 …

12.Elasticsearch应用(十二)

Elasticsearch应用&#xff08;十二&#xff09; 1.单机ES面临的问题 海量数据存储问题单点故障问题 2.ES集群如何解决上面的问题 海量数据存储解决问题&#xff1a; 将索引库从逻辑上拆分为N个分片&#xff08;Shard&#xff09;&#xff0c;存储到多个节点单点故障问题&a…

自动求导与可微分编程

1.张量的自动求导 1.1 自动求导机制 张量的自动求导机制是现代深度学习框架&#xff08;如PyTorch和TensorFlow&#xff09;的核心功能之一&#xff0c;它允许开发者在无需手动计算梯度的情况下&#xff0c;自动获得神经网络中所有参数相对于损失函数的梯度。以下是这一机制的…