版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/weixin_41969587,未经博主允许不得转载。 https://blog.csdn.net/weixin_41969587/article/details/82723593
问题描述
将一个区域,分成 m×n 个块,若某一个块有冰则用 * 表示,无冰则用 0 表示,任给一个这样的区域,求冰田区域(冰田区域划分规则:如果两个小块之间能够在不穿越其他块的情况下连成直线,则**属于同一冰田区块)个数?
输入
输出
冰块数
样例输入输出
- 输入
-
4 4
* 0 0 0
0 0 0 0
0 0 * 0
0 0 0 *
4 6
0 0 0 0 0 0
0 0 * 0 0 *
0 0 * * 0 0
0 0 0 * 0 * - 输出
-
2
3
问题分析
- 首先遍历到 * 的点,冰块数+1,并且该 * 点连起来的冰块区域 * 点全部变为 0
- 遍历完所有的点即可,输出冰块数
代码实现
#include<iostream>
using namespace std;
const int MaxSize=1000;
class MGraph{//构建图
public:
MGraph(int n,int m);
char adj[MaxSize][MaxSize];
};
MGraph::MGraph(int n,int m){//初始化
for(int i=0;i<=n;i++)//第一列全部置为0
adj[i][0]='0';
for(int i=0;i<=m;i++)//第一行全部置为0
adj[0][i]='0';
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>adj[i][j];//输入节点
}
void DFS(MGraph &G,int i,int j){//深度遍历,把*的所有连在一起的点全部变为0
int ti=i+1,tj=j+1;
int ki=i-1,kj=j-1;
for(int b=ki;b<=ti;b++)//把该点的八个方向和自身都遍历
for(int c=kj;c<=tj;c++){//遇到是*的全部变为0
if(G.adj[b][c]=='*')
{
G.adj[b][c]='0';
DFS(G,b,c);
}
}
}
int main(){
int n,m,num;
while(1){
num=0;
cin>>n>>m;
MGraph G(n,m);//创建图
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(G.adj[i][j]=='*'){
num++;//第一次遇到*,num++
DFS(G,i,j);//把该*点的全部邻接点变为0
}//继续的遍历
}
cout<<num<<endl;
}
return 0;
}
代码如有错误,欢迎大家指点出来!