C++数组遍历(BFS和DFS)

本文探讨了深度优先搜索DFS和广度优先搜索BFS在C++中遍历数组矩阵的方法。虽然时间复杂度较高,但它们为矩阵元素遍历提供了不同策略。程序测试显示了两种算法的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度优先遍历DFS是针对树中某个节点首先朝一个子节点方向一直遍历到叶子节点,然后通过递归(或者压栈)将所有节点遍历完成。而广度优先遍历BFS是对一个节点的子节点全部遍历完成后继续遍历子节点的所有子节点,最终完成整个遍历过程。因此,我们将这两种算法应用到矩阵的元素遍历上。(时间复杂度较大>O(n^2)可优化

#include<iostream>
#include<queue>
#include<utility>
#include<cmath>
#include<windows.h>
using namespace std;
int num[1000][1000];
bool reach[1000][1000];
int row, col;//记录矩阵行列
void init();
void bfs(pair<int,int>&obj);
void dfs(pair<int, int>&obj);
void part_dfs(pair<int,int>&obj);
void init_reach();
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> row >> col;
	init();
	pair<int, int>begin;
	cout << "please input begin vertex." << endl;
	cin >> begin.first >> begin.second;
	cout << "BFS:\n";
	bfs(begin);
	cout << "\nDFS:\n";
	dfs(begin);
	system("pause");
	return 0;
}
void init()
{
	for (int i = 1; i <= row;++i)
	for (int j = 1; j <= col; ++j)
		cin >> num[i][j];
}
void init_reach()
{
	for (int i = 1; i <= row; ++i)
	for (int j = 1; j <= col; ++j)
		reach[i][j] = false;
}

void bfs(pair<int, int>&obj)
{
	init_reach();
	queue<pair<int,int>>q;
	q.push(obj);
	reach[obj.first][obj.second] = true;
	while (!q.empty())
	{
		pair<int, int>temp = q.front();
		q.pop();
		cout << num[temp.first][temp.second] << " ";
		for (int i = 1; i <= row;++i)
		for (int j = 1; j <= col; ++j)
		{
			if (reach[i][j]) continue;
			else if (abs(temp.first - i) == 1 && j == temp.second || 
				abs(temp.second - j) == 1 && i == temp.first)
			{
				pair<int, int>*p = new pair<int, int>(i,j);
				q.push(*p);
				reach[i][j] = true;
				delete p;
			}
		}
	}
}

void dfs(pair<int, int>&obj)
{
	init_reach();
	part_dfs(obj);
}

void part_dfs(pair<int, int>&obj)
{
	reach[obj.first][obj.second] = true;
	cout << num[obj.first][obj.second] << " ";
	for (int i = 1; i <= row; ++i)
	for (int j = 1; j <= col; ++j)
	{
		if (reach[i][j]) continue;
		else if (abs(obj.first - i) == 1 && j == obj.second ||
			abs(obj.second - j) == 1 && i == obj.first)
		{
			pair<int, int>*p = new pair<int, int>(i, j);
			part_dfs(*p);
			delete p;
		}
	}
}

程序测试结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值