本子君

洛谷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;
}

 

posted on 2019-06-11 23:12  本子君  阅读(239)  评论(0编辑  收藏  举报

导航