ans(深搜宽搜都有)

x-wangziji 2022-05-15 17:08:47 29 返回题目

//深搜代码
#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; ? ? ? 
}
*/
{{ vote && vote.total.up }}

共 1 条回复

071maozihan

老实交代!为什么不高亮!