6.4 图
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
yes no yes
两种方法
一,
#include <iostream>
using namespace std;
const int INF=100;
int n,m;
char mp[INF][INF];
void view(int i,int j) //遍历函数
{
if(mp[i][j]!='@'||i<0||j<0||i>=n||j>=m) //判断是否越界,是否为要求字符
return ;
else
{
mp[i][j]='*';
view(i-1,j-1); // 遍历mp[i][j]周围的格子
view(i-1,j);
view(i-1,j+1);
view(i,j-1);
view(i,j+1);
view(i+1,j-1);
view(i+1,j);
view(i+1,j+1);
}
}
int main()
{
while(cin>>n>>m)
{ int p=0;
if(n==0||m==0) break; //输入0 0结束
for(int i=0;i<n;i++)
{for(int j=0;j<m;j++)
cin>>mp[i][j];
}
for(int i=0;i<n;i++)
{ for(int j=0;j<m;j++)
{if(mp[i][j]=='@')
{ view(i,j);
p++; //计数器,查看便利几次可以遍历所有的指定字符
}
}
}
cout<<p<<endl;
}
}
二,紫薯上的方法
#include<iostream>
#include<cstring>
const int man=100;
int mp[man][man];
int sc[man][man];
int m,n;
using namespace std;
void la(int i,int j,int p)
{
if(i<0||i>=m||j<0||j>=n) return ;
if(sc[i][j]>0||mp[i][j]!='@') return ;
sc[i][j]=p; //连通分量编号,即记录访问几次指定字符附近的格子
for(int a=-1;a<=1;a++)
{
for(int b=-1;b<=1;b++)
if(a!=0||b!=0) //除自身的格子,便利周围的
la(a+i,b+j,p);
}
}
int main()
{
int p=0;
while(cin>>m>>n)
{
if(m==0||n==0)
break;
memset(sc,0,sizeof(sc)); //将设定的数组初始化
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cin>>mp[i][j];
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(sc[i][j]==0&&mp[i][j]=='@') //遍历条件
la(i,j,++p);
cout<<p<<endl;
}
return 0;
}