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