/**
序号:num_1
作者: MrZhang
日期: 2016-5-19
题目名称:黑白图像
题目来源:《算法竞赛入门经典1 —— 6.4图 —— 6.4.1黑白图像 P107》
数据样例:
6
6
1 0 0 1 0 0
0 0 1 0 1 0
0 0 0 0 0 0
1 1 0 0 0 0
1 1 1 0 0 0
0 1 0 1 0 0
输出:3
*/
#include <iostream>
#include <cstring>
#define maxn 100
using namespace std;
int G[maxn][maxn];
int visited[maxn][maxn];
int row,column;
bool check(int x,int y){
if(x >= 0 && x <= row -1 && y >= 0 && y <= column-1 && G[x][y] && !visited[x][y]) return true;
else return false;
}
/**
012
7 3
654
*/
// 0 1 2 3 6 5 4
int dx[10] = {-1,-1,-1, 0, 1,1,1, 0};
int dy[10] = {-1, 0, 1, 1, -1,0,1, -1};
void DFS(int x,int y){
for(int i=0;i<8;i++){
int u = x + dx[i] , v = y + dy[i];
if(check(u,v)) {
visited[u][v] = 1;//!注意:不要忘了在访问过后加 访问过 标记
DFS(u,v);
}
}
}
int main(){
/*初始化数组*/
memset(G,0,sizeof(G)); //!memset的使用:使用memset初始化数组时可直接 “sizeof(整个数组)”。
memset(visited,0,sizeof(visited));
/*输入数据*/
cout<<"输入行数:"; cin>>row;
cout<<"输入列数:"; cin>>column;
cout<<"请按自上而下、自左至右的顺序输入图:"<<endl;
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
cin >> G[i][j];
}
}
int counts = 0;
/*深度优先 搜索图 : DFS*/
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
if(G[i][j]&&!visited[i][j]){
counts ++; //!若找到一个新的八连块,就将数量加1。
visited[i][j] = 1; //!注意:不要忘了给起点加 访问过 标记
DFS(i,j);
}
}
}
cout<<"图中总计有"<<counts<<"个八连块";
}
/**
总结:
题型:图的遍历
原理:深度优先搜索(DFS)
技巧:做 “图的遍历” 题目,图的存储结构有多种选择。
若要存储的图是矩阵类型,使用二维数组就可以。若图是“稀疏图”,则最佳选择是使用“邻接表”存储图。
*/
图的遍历——黑白图像——深度优先搜索(DFS)
原文作者:数据结构之图
原文地址: https://blog.csdn.net/ZZh1301051836/article/details/51454340
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/ZZh1301051836/article/details/51454340
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。