zoukankan      html  css  js  c++  java
  • 洛谷P1162

    码一下,写两个数组会爆栈,只能在dfs里用赋值的数组,用标记数组就会爆栈

    今天来看看BFS,然后又用DFS敲了一下,下面代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[35][35],vis[35][35],n;
    int k[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    
    void dfs(int x,int y)
    {
        if(x>=n || x<0 || y>=n || y<0)
        {
            return ;
        }
        else 
        {
            for(int i=0;i<4;i++)
            {
                if(a[x+k[i][0]][y+k[i][1]]==0 && !vis[x+k[i][0]][y+k[i][1]])
                {
                    vis[x+k[i][0]][y+k[i][1]]=1;
                    dfs(x+k[i][0],y+k[i][1]);
                }
            }
        }
    }
    
    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>a[i][j];
                if(a[i][j]==1)
                    vis[i][j]=1;        
            }
        }
        for(int j=0;j<n;j++)//上边
        {
            if(a[0][j]==0 && !vis[0][j])
                dfs(0,j);
        } 
        for(int j=0;j<n;j++)//下边
        {
            if(a[n-1][j]==0 && !vis[n-1][j])
                dfs(n-1,j);
        } 
        for(int i=0;i<n;i++)//左边
        {
            if(a[i][0]==0 && !vis[i][0])
                dfs(i,0);    
        } 
        for(int i=0;i<n;i++)
        {
            if(a[i][n-1]==0 && !vis[i][n-1])
                dfs(i,n-1);
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(!vis[i][j])
                    cout<<2<<" ";
                else
                    cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }

    用vis数组来标记原来的数字1和之后所查找的四个边的联通0,vis打过标记后就不用去掉了

    输出的时候按是否有无标记输出,有标记输出原来的数,没标记输出2

    然后是BFS,下面代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[35][35],vis[35][35],n;
    int t[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    queue<int> q;
    
    void bfs(int x,int y)
    {
        vis[x][y]=1;
        q.push(x);
        q.push(y);
        while(!q.empty())
        {
            int k=q.front();
            q.pop();
            int l=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                if(a[k+t[i][0]][l+t[i][1]]==0 
                   && k+t[i][0]>=0 && k+t[i][0]<n 
                   && l+t[i][0]>=0 && l+t[i][0]<n && !vis[k+t[i][0]][l+t[i][1]])
                   {
                           vis[k+t[i][0]][l+t[i][1]]=1;
                           q.push(k+t[i][0]);
                           q.push(l+t[i][1]);
                   }
            }
        }
    }
    
    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>a[i][j];
                if(a[i][j]==1)
                    vis[i][j]=1;
            }
        }
        for(int j=0;j<n;j++)//上边 
        {
            if(!a[0][j] && !vis[0][j])
                bfs(0,j);
        }
        for(int j=0;j<n;j++)//下边 
        {
            if(!a[n-1][j] && !vis[n-1][j])
                bfs(n-1,j);
        }
        for(int i=0;i<n;i++)//左边
        {
            if(!a[i][0] && !vis[i][0])
                bfs(i,0);
        }
        for(int i=0;i<n;i++)//右边
        {
            if(!a[i][n-1] && !vis[i][n-1])
                bfs(i,n-1);
        } 
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(!vis[i][j])
                    cout<<2<<" ";
                else
                    cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/benzikun/p/11006901.html
Copyright © 2011-2022 走看看