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<
				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<
				if(cnt==(maxi-mini+1)*(maxj-minj+1)) s1++;
				else s2++;
			}
		}
	}
	cout<<s1<<endl<<s2;
	return 0;
}

这仨题都一个思路滴
OvO

你可能感兴趣的:(Classcial Depth First Search(1))