Classcial Depth First Search(1)

嘿嘿,兄弟,来啦!

迷宫问题

Description
设有一个N∗N(2≤N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。

Samples
Input Copy
3
0 0 0
0 1 1
1 0 0​
Output
2

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20;
const ll inf = 0x3f3f3f3f;
int n,ans=0;
int a[N][N],vis[N][N];
void dfs(int x,int y) {
	int dir1[]= {-1,1,0,0,-1,1,-1,1};
	int dir2[]= {0,0,-1,1,1,1,-1,-1};
	if(x==1&&y==n) {
		ans++;
		return;
	}
	for(int i=0; i<8; i++) {
		int t1 = x + dir1[i];
		int t2 = y + dir2[i];
		if(t1>=1&&t1<=n&&t2>=1&&t2<=n&&a[t1][t2]==0&&vis[t1][t2]==0) {
			vis[x][y]=1;
			dfs(t1,t2);
			vis[x][y]=0;
		}
	}
	return ;
}
int main() {
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			cin>>a[i][j];
	vis[1][1]=1;
	dfs(1,1);
	cout<<ans;
	return 0;
}

地图

Description
给定一张地图,定义 X 表示陆地,O 表示海洋。两个格子连通,当且仅当它们共边。一个大陆定义是一个极大的陆地连通块。极大的连通块的定义是不存在一个格子与当前连通块中的某个格子相连 但不属于当前连通块。问地图中有几个大陆。

Input
第一行两个数 N,M,表示地图的大小,以下 N 行,每行 M 个字母。
Output
一个数,表示大陆个数。

Samples
Input Copy
5 5
XXXOO
OOXOO
OOOXX
XOOOO
XOXXX
Output
4
Hint
对于 30%的数据,满足 1≤N,M≤50。
对于 100%的数据,满足 1≤N,M≤1000。

Code:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int N = 1010;
const int mod = 200;
int n,m;
char s[N][N];
int cnt=0;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y) {
	s[x][y]='O';
	for(int k=0; k<4; k++) {
		int nx = x+dir[k][0];
		int ny = y+dir[k][1];
		if(s[nx][ny]=='X') {
			dfs(nx,ny);
		}
	}
	//return;
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			cin>>s[i][j];
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			if(s[i][j]=='X') {
				dfs(i,j);
				//cout<<i<<" "<<j<<endl;
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}

卫星照片

Description
牧羊人达瓦正在研究他们牧场的卫星照片.照片为一个 R (1≤R≤75) 行 C(1≤C≤75) 列的字符矩阵表示。如下图:

…#####…##…
…#####…##…

#…###…#.
#…#####…
图上的一块相连通的 “#” 表示一群绵羊或一个帐篷, 两个子"#" 连通的意思是说左右或上下相连。而下面的两块则是分开的:

.#…
…#.

达瓦现在根据卫星照片上的的这些"#"块的形状来判断哪些是羊群,哪些是帐篷。如果矩形内只有‘#’,则是帐篷,其它的则认为都是羊群。在第一个图中,有三个帐篷 ( 2x1, 2x5,and 1x1)和 2 群羊。
根据输入文件的数据,统计出帐篷数和羊群数,数据中羊群不会包围另一个羊群或帐篷。

Input
第一行,两个整数: R 和 C. 和 2…R+1 行: 第 i+1 行表示照片的第 i 行情况,由 C 字符组成。
Output
第一行: 帐篷数。
第二行: 羊群数。
Samples
Input
5 8
#####…#
#####.##
…#.
.###…#
.###…##
Output
2
2

Code:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int N = 100;
const int mod = 200;
int R,C;
char s[N][N];
int cnt,mini,minj,maxi,maxj;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int x,int y) {
	s[x][y]='.';
	cnt++;
	mini = min(mini,x);
	minj = min(minj,y);
	maxi = max(maxi,x);
	maxj = max(maxj,y);
	for(int k=0; k<4; k++) {
		int nx = x+dir[k][0];
		int ny = y+dir[k][1];
		if(s[nx][ny]=='#') {
			dfs(nx,ny);
		}
	}
	return;
}
int main() {
	cin>>R>>C;
	for(int i=1; i<=R; i++) {
		for(int j=1; j<=C; j++) {
			cin>>s[i][j];
		}
	}
	int s1=0,s2=0;
	for(int i=1; i<=R; i++) {
		for(int j=1; j<=C; j++) {
			if(s[i][j]=='#') {
				cnt=0;
				mini = 99,minj = 99;
				maxi = 0,maxj = 0;
				dfs(i,j);
				//cout<<mini<<" "<<minj<<" "<<maxi<<" "<<maxj<<endl;
				if(cnt==(maxi-mini+1)*(maxj-minj+1)) s1++;
				else s2++;
			}
		}
	}
	cout<<s1<<endl<<s2;
	return 0;
}

这仨题都一个思路滴
OvO

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经典网络是指在计算机科学领域,早期应用广泛的网络结构类型。它指的是在互联网出现之前使用的传统网络结构。经典网络通常基于分层结构设计,由若干个网络层组成,每一层负责特定的功能。 在经典网络,最常见的是OSI模型(开放系统互联模型)和TCP/IP模型(传输控制协议/互联网协议)这两种标准化网络模型。OSI模型被广泛接受并应用于网络协议的设计和实现,它将网络通信分为七个层次,包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。TCP/IP模型则将网络通信分为四个层次,包括网络接口层、网络层、传输层和应用层。 经典网络架构为数据传输提供了良好的结构和框架。例如,经典网络的分层结构能够将不同的功能分配给不同的层次,提高了网络的可维护性和可扩展性。每个层次都有确定的功能和责任,使得网络的开发和管理更加简化。 然而,随着互联网的发展和技术的进步,经典网络逐渐被更为高级和复杂的网络架构所取代,如软件定义网络(SDN)和云计算等。这些新兴的网络架构更加灵活和可扩展,能够更好地适应现代应用的需求。 综上所述,经典网络是指互联网出现之前使用的传统网络架构类型,具有分层结构和规范化的网络模型。尽管在现代网络发展逐渐被取代,但经典网络的设计思想和基本原理仍然对我们理解和构建网络系统有着重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值