P1162 填涂颜色

P1162 填涂颜色


在这里插入图片描述

思路:
首先要找到闭合中的第一个数(因为使用了双重循环,而且只有一个闭环,所以找到了就可以了,f函数),然后在使用找到的第一个数对闭环中的数字进行改变(ff函数);
我对题中的数据改了改,图中的0改为了1,1改为2,这样做的目的是数组直接赋0,如果搜索的时候搜索到0,说明了到数组的边界了,直接return ,并且这样做可以不用考虑边界的问题。
使用了flag标记,如果f函数中始终没有出现边界,说明这是一个闭环,就是找到了闭环中的第一个数

#include<bits/stdc++.h>
using namespace std;
int mapp[35][35]={0};
int visit[35][35]={0};
int flag=0;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
void f(int x,int y){
    if(mapp[x][y]==0){
        flag=1;//如果到边界了,说明不是闭环
        return;
    }
    if(mapp[x][y]==2){
        return;
    }
    else{
        for(int i=0;i<4;i++){
            visit[x][y]=1;
            int a=dx[i]+x;
            int b=dy[i]+y;
            if(visit[a][b]==0){
                f(a,b);
            }
        }
    }
}

void ff(int x,int y){
    if(mapp[x][y]==2){
        return;
    }
    else if(mapp[x][y]==1){
        for(int i=0;i<4;i++){
            mapp[x][y]=3;
            int a=x+dx[i];
            int b=y+dy[i];
            ff(a,b);
        }
    };
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            int m;
            cin>>m;
            mapp[i][j]=m+1;
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mapp[i][j]==1&&visit[i][j]==0){
                flag=0;
                f(i,j);
                if(flag==0){
                    ff(i,j);
                    for(int k1=1;k1<=n;k1++){
                        for(int k2=1;k2<=n;k2++){
                            if(k2==1){
                                cout<<mapp[k1][k2]-1;
                            }
                            else
                                cout<<" "<<mapp[k1][k2]-1;
                        }
                        cout<<endl;
                    }
                    return 0;
                }
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值