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;
    }
  • 相关阅读:
    html-fieldset线中嵌套字符
    在Windows平台上绿色安装postgresQL
    tomcat处理中文文件名的访问(乱码)
    CSS div水平垂直居中和div置于底部
    java-工具类-读取配置文件
    Win+Ctrl键设置
    eclipse-将同一个文件分屏显示
    spring-poi-excle往单元格写入图片
    spring-初始化完成后运行指定内容
    java-collections.sort异常Comparison method violates its general contract!
  • 原文地址:https://www.cnblogs.com/benzikun/p/11006901.html
Copyright © 2011-2022 走看看