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