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;
    }
  • 相关阅读:
    IIS部署.net core 的程序后,如何查看控制台的日志?
    Java中string的编码的详细说明
    explicit禁止被用来执行隐式类型转换。仍可以进行显示转换
    判断一个IP字符串为有效的IP方法
    链接原理
    tcp套接字地址
    c/c++中的__attribute__((weak))使用
    关于multiple definition of 错误说明很详细的文章【转载】
    c/c++中结构体中的位域在大小端设备上的内存存储方式----------位域
    TCP之数据缓冲区大小及其限制
  • 原文地址:https://www.cnblogs.com/benzikun/p/11006901.html
Copyright © 2011-2022 走看看