• 1329 【例8.2】细胞


    法一:DFS!!(详细看注释)

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;//行列 
    char mp[70][70];//地图 
    int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向 
    int ans=0;//答案 
    
    void pr(){//测试函数 
        cout<<"--------------"<<endl;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cout<<mp[i][j];
            }
            cout<<endl;
        }
    }
    
    void dfs(int x,int y){
        mp[x][y]='0';
        for(int i=0;i<4;i++){
            int nx=x+next[i][0];
            int ny=y+next[i][1];
            
            if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]!='0'){
    //            pr(); 
    //            cout<<endl;
                dfs(nx,ny);
            }
        }
    }
    int main(){
        cin>>n>>m;
        
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>mp[i][j];
            }
    
        }
    //    pr();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]!='0'){//当不为‘0’时开始遍历 
                    ans++; 
                    dfs(i,j);//从当前位置开始遍历 
                }
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    
     

    法二:BFS!!

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int x,y;
    }que[3610];//结构体,方便记录同一个点的横纵坐标 
    int fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//方向 
    char mp[70][70]={0};//地图 
    int ans=0;//细胞个数 
    int f,r;//队首,队尾 
    int n,m;//行列 
    void pr(){//测试函数 
        cout<<"--------"<<endl;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cout<<mp[i][j];
            }
            cout<<endl;
        }
    }
    void bfs(int x,int y){
        f=r=1;//初始化队列 
        que[r].x=x , que[r].y=y , mp[x][y]='0';//将初始位置插入队列,并将当前位置改为已访问 
        while(f<=r){
            node t;
            t.x=que[f].x , t.y=que[f].y;//设立新结构体,记录队首横纵坐标 
            
            for(int i=0;i<4;i++){
                int nx=t.x+fx[i][0];//下一个位置的横坐标 
                int ny=t.y+fx[i][1];//下一个位置的纵坐标 
                
                if(nx>=0 && nx<n && ny>=0 && ny<m && mp[nx][ny]!='0'){//约束条件 
                    mp[nx][ny]='0';//将当前位置更改为‘0’ 
    //                pr();
                    r++;//为入队做准备 
                    que[r].x=nx;
                    que[r].y=ny;
                }
            }
            f++;//队首出队 
        }
    }
    int main(){
        cin>>n>>m; 
        for(int i=0;i<n;i++) cin>>mp[i];
    //    pr();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]!='0'){
                    ans++;//只要不是‘0’,答案就+1; 
                    bfs(i,j);
                }
            }
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    LeetCode(122. 买卖股票的最佳时机 II)
    LeetCode(485. 最大连续1的个数)

    约瑟夫问题
    链表
    队列
    稀疏数组
    乐优商城项目学习
    LeetCode_Climbing Stairs
    数据结构&&算法基础知识
  • 原文地址:https://www.cnblogs.com/qwn34/p/13768417.html
Copyright © 2020-2023  润新知