64分求助

P1162 填涂颜色

hhy8399 @ 2024-05-19 11:50:43

#include<bits/stdc++.h>
using namespace std;

int n,cnt;
int a[40][40];
int b[40][40];

void dfs(int x,int y)
{
    if (x <= 0 || x >= n + 1 || y <= 0|| y >= n+1|| a[x][y] != 0) return ;
    a[x][y] = 2;
    dfs(x + 1,y);
    dfs(x - 1,y);
    dfs(x,y + 1);
    dfs(x,y - 1);
}

void dfs2(int x,int y)//写一个标记外围不用涂色的部分主函数开始时运行,循环上色时跳过已标记区域
{
    if (x < 0 || x > n + 1 || y < 0|| y > n+1|| b[x][y] != 0) return ;
    b[x][y] = 2;
    dfs2(x + 1,y);
    dfs2(x - 1,y);
    dfs2(x,y + 1);
    dfs2(x,y - 1);
}

int main()
{
    cin >> n;
    for(int i = 1;i <= n; i++)
    {
        for(int j = 1;j <= n;j++)
        {
            cin >> a[i][j];
            b[i][j] = a[i][j];
        }
    }
    dfs2(1,1);//标记外围
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            if(b[i][j] == 2)//标记过的外围跳过
            {
                continue;
            }
            if(a[i][j] == 0)
            {
                dfs(i,j);
            }
        }
        }
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

3 && #6 WA,求调


by pengyilin @ 2024-05-19 12:03:21

@hhy8399

代码懒得改,拿AC去用就是。(大不大方)?

求关注。

#include<bits/stdc++.h> 
using namespace std;
int n,a[31][31],b[31][31];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1}; 
struct node
{
    int x,y;
}now;
void bfs(int x,int y)
{
    queue<node> q;
    q.push({x,y});
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        b[now.x][now.y]=-1;
        for(int i=0;i<4;i++)
        {
            int xx=now.x+dx[i];
            int yy=now.y+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&b[xx][yy]>=0&&a[xx][yy]==0)
            {
                q.push({xx,yy});
                b[xx][yy]=-1;
            }   
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j]; 
            b[i][j]=a[i][j];
        }  
    }
    for(int i=1;i<=n;i++)
        if(a[1][i]==0) bfs(1,i);
    for(int i=1;i<=n;i++) 
        if(a[i][1]==0) bfs(i,1);
    for(int i=1;i<=n;i++)
        if(a[n][i]==0) bfs(n,i);
    for(int i=1;i<=n;i++)
        if(a[i][n]==0) bfs(i,n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(b[i][j]==-1) cout<<0<<" ";
            else if(b[i][j]==0) cout<<2<<" ";
            else cout<<b[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

by hhy8399 @ 2024-05-19 23:05:22

@pengyilin ok,谢谢


by hhy8399 @ 2024-05-19 23:08:01

@pengyilin 我知道哪里错了,不过我是深搜,你的是广搜,我还是自己写吧(懒得改成BFS,要全部重新写


by pengyilin @ 2024-05-20 18:11:47

@hhy8399

听懂掌声。


by hhy8399 @ 2024-05-21 20:18:52

@pengyilin 你怎么棕名了呀?


by rimen @ 2024-06-14 18:39:33

@pengyilin 你的广搜对我这种深搜党来说实在是个好东西,已关注。


|