//深搜代码
#include <bits/stdc++.h>
using namespace std;
int n,m,cnt=0;
char a[100][100];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void dfs(int x,int y){
a[x][y]='0';
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if (a[nx][ny]=='0') continue;
dfs(nx,ny);
}
}
int main(){
cin>>n>>m;
memset(a,'0',sizeof(a));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]!='0'){
cnt++;
dfs(i,j);
}
cout<<cnt;
}
/*宽搜代码
#include<bits/stdc++.h>
using namespace std;
char a[100][100];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int n,m,cnt=0;
queue<int>qx; //建立队列qx,存储行,类型为整数
queue<int>qy; //建立队列qx,存储列,类型为整数
int main() {
cin>>n>>m;
for (int i=0;i<=n+1;i++)
for (int j=0;j<=m+1;j++)
a[i][j]='0'; ?//四周加一圈'0'
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cin>>a[i][j]; //读入数据存入字符数组
for (int i=1;i<=n;i++)//枚举每一个字符
for (int j=1;j<=m;j++)
if (a[i][j]!='0') { //找到一个非'0’的字符的位置
cnt++;//找到非'0',即找到了一个细胞
qx.push(i);//将该位置的行x值入队到qx队列
qy.push(j);//将该位置的列y值入队到qy队列
a[i][j]='0';//将该字符修改为'0',避免重复搜索
while(!qx.empty()){//当队列不空的时候
int x=qx.front(),y=qy.front(); //分别取出队首的行x和列y的值
qx.pop();//队首出队列
qy.pop();//队首出队列
for (int k=0;k<4;k++){ //枚举上下左右4个方向
int nx=x+dx[k]; //新的行nx
int ny=y+dy[k]; //新的列ny
if (a[nx][ny]=='0') continue;//不是细胞跳过
qx.push(nx);//新的行nx入队
qy.push(ny); //新的列ny入队
a[nx][ny]='0';//标记为'0',避免重复搜索
}
}
}
cout<<cnt;//输出细胞的数量
return 0; ? ? ?
}
*/
共 1 条回复
老实交代!为什么不高亮!