圖的入門之的深度遍歷

PS:終於開始圖的學習之旅了,先來個開胃小菜,圖的深度遍歷(DFS),個人代碼如下:

#include<stdio.h>
#include<iostream>
using namespace std;

void dfs(char a[][5], int row, int col, int r, int c, const char tag = '#')
{
	if(r < 0 || r > row - 1 || c < 0 || c > col - 1) return;
	if(tag == a[r][c]) return ;	<span style="white-space:pre">	</span>//訪問過的點不需要再訪問了
	cout<< a[r][c] << " ";
	a[r][c] = tag;				//訪問過的點用#號來標記
	for(int i = -1; i <= 1; ++i)
		for(int j = -1; j <= 1; ++j)
		{
			if(i == 0 && j == 0) continue;
			dfs(a, row, col, r+i, c+j);
		}
}

int main()
{
	const int COL = 5;
	int row;
	cin >> row ;
	char a[row][COL];
	for(int i = 0; i < row; ++i)
		scanf("%s", a[i]);
	dfs(a, row, COL, 0, 0);
}
輸入和輸出:


圖的廣度遍歷(BFS), 個人代碼如下:

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

const int ROW = 3;
const int COL = 5;
const int dr[] = {1, -1, 0, 0};
const int dc[] = {0, 0, -1, 1};

void BFS(char a[][COL])
{
	queue<pair<int, int> > que;
	pair<int, int> par;
	int row, col;
	que.push(make_pair(0,0));
	while(!que.empty())
	{
		//訪問周邊的節點,放入到隊列中
		par = que.front(); que.pop();
		for(int i = 0; i < 4; ++i)
		{
			row = par.first; row = row + dr[i];
			col = par.second; col = col + dc[i];
			if(row < 0 || row >= ROW || col < 0 || col >= COL) continue;
			que.push(make_pair(row, col));
		}
		//輸出訪問的點
		if(a[par.first][par.second] == '#') continue;<span style="white-space:pre">	</span>//訪問過的點用#標記
		cout<< a[par.first][par.second] <<endl;
		a[par.first][par.second] = '#';
	}
}

int main()
{
	char a[ROW][COL];
	memset(a, 0, sizeof(a));
	for(int i = 0; i < ROW; ++i)
		scanf("%s", a[i]);

	BFS(a);
	return 0;
}

輸入:

abcde

fghij

opqrs



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章