P1162 填涂颜色

原题链接 https://www.luogu.org/problemnew/show/P1162

一道很水很简单搜索题,好吧我还是交了4次才过的......

说一下简单的思路:

首先输入n*n的矩阵,包含0和1,存入map数组里;

然后我们在开一个a数组,可以对它进行如下编译:如果map数组对应的元素为1,则a数组存1,其余的存0;

for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
           {
           cin>>map[i][j];
           if(map[i][j]==0) a[i][j]=0;
           else a[i][j]=1;
        }

既然有且仅有一个环形闭合圈,那么我们不妨从头开始搜,搜到一个不为0的数(其实就是墙)就返回,否则就把它染成2(既然没碰到墙,那么肯定在圈外)

这样一来原先为0的位置就是环形圈内的元素,输出的时候把它改成2就好啦!

但是......如果一开始的map[1][1]就是1(墙)咋办.......我一开是也忘了这一点,因此WA了3个点.....

解决的办法就是:

既然我们开的是一个1~n的n*n矩阵,所以我们再从外面套上一环,即矩阵变为0~n+1的(n+1)*(n+1)矩阵

这样一来不管你是(1,1),(1,n),(n,1),(n,n)这些角上的元素还是魑魅魍魉妖魔都可以被遍历到啦qaq

好了,下面上代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,map[35][35],a[35][35];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
void search(int x,int y)
{
    int i;
    if(x<0||x>n+1||y<0||y>n+1||a[x][y]!=0)   //如果跑出去了或撞墙则返回 
    return ;
    a[x][y]=2;                               //在环形圈外染成2做下标记 
    for(i=0;i<4;i++)                         //向四个方向遍历 
    search(x+dx[i],y+dy[i]);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
           {
           cin>>map[i][j];
           if(map[i][j]==0) a[i][j]=0;       //同样给一个变动数组a做上标记 
           else a[i][j]=1;
        }
    search(0,0);                          //从(0,0)开始遍历 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
        if(a[i][j]==0) cout<<2<<" ";      //a数组中的0元素就是需要被染成2的地方 
        else cout<<map[i][j]<<" ";        //其他照常输出 
        }
        cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xcg123/p/10744024.html