算法六:深度优先搜索dfs(Depth-First-Search)(城堡问题、踩方格)

dfs通俗概念:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题一、城堡问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解题思路:
在这里插入图片描述
在这里插入图片描述
详细C++代码如下:

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

int R, C;
int rooms[60][60];
int color[60][60];
int maxRoomArea = 0, roomNum = 0;
int roomArea;

void Dfs(int i, int k)
{
	if(color[i][k])
		return;
	++roomArea;
	color[i][k] = roomNum;
	if((rooms[i][k] & 1) == 0) 
		Dfs(i, k - 1);
	if((rooms[i][k] & 2) == 0)
		Dfs(i - 1, k);
	if((rooms[i][k] & 4) == 0)
		Dfs(i, k + 1);
	if((rooms[i][k] & 8) == 0)
		Dfs(i + 1, k);
}

int main()
{
	cin >> R >> C;
	for(int i = 1; i <= R; ++i)
	{
		for(int k = 1; k <= C; ++k)
		{
			cin >> rooms[i][k];
		}
	}
	memset(color, 0, sizeof(color));
	for(int i = 1; i <= R; ++i)
	{
		for(int k = 1; k <= C; ++k)
		{
			if(!color[i][k])
			{
				++roomNum;
				roomArea = 0;
				Dfs(i, k);
				maxRoomArea = max(roomArea, maxRoomArea);
			}
		}
	}
	cout << roomNum << endl;
	cout << maxRoomArea << endl;
}

样例运行结果如下:
在这里插入图片描述

例题二、踩方格

在这里插入图片描述
在这里插入图片描述
详细C++代码如下:

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

int visited[30][50];
int ways(int i, int j, int n)
{
	if(n == 0)
		return 1;
	visited[i][j] = 1;
	int num = 0;
	if(!visited[i][j - 1])
		num += ways(i, j - 1, n - 1);
	if(!visited[i][j + 1])
		num += ways(i, j + 1, n - 1);
	if(!visited[i + 1][j])
		num += ways(i + 1, j, n - 1);
	visited[i][j] = 0;
	return num;
}

int main()
{
	int n;
	cin >> n;
	memset(visited, 0, sizeof(visited));
	cout << ways(0, 25, n) << endl;
	return 0;
}

如果喜欢我的文章,请记得三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

发布了99 篇原创文章 · 获赞 16 · 访问量 5905

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/105329318