洛谷 P1162 填涂颜色
洛谷上标签显示算法是 bfs,所以肯定是用广搜啦。
我的思路是在所给的方针外在添一圈0;也就是这样:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
再从左上角的第一个数开始搜索,如果搜到1的话,再换一个方向搜,用一个数组vis来存储搜到的点,最终将所搜到的点排除,再排除值为1的点,最终剩下的点再赋值为2就可以了,具体看代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> //STL队列 5 using namespace std; 6 int a[35][35]; 7 struct zkw{ 8 int x; 9 int y; 10 }; 11 zkw w; 12 bool vis[35][35]; 13 int dx[4]={1,-1,0,0}; //方向 14 int dy[4]={0,0,-1,1}; //方向 15 queue<zkw> q; 16 int main() 17 { 18 memset(a,0,sizeof(a)); 19 memset(vis,0,sizeof(vis)); 20 int n; 21 cin>>n; 22 for(int i=1;i<=n;++i) 23 { 24 for(int j=1;j<=n;++j) 25 { 26 scanf("%d",&a[i][j]); 27 } 28 } 29 q.push((zkw){0,0}); 30 vis[0][0]=1; 31 while(!q.empty()) 32 { 33 w=q.front(); 34 q.pop(); 35 for(int i=0;i<4;++i) 36 { 37 int xx=w.x+dx[i],yy=w.y+dy[i]; 38 if(xx>=0 && xx<=n+1 && yy>=0 && yy<=n+1 && vis[xx][yy]==0 && a[xx][yy]!=1) //在范围内符合要求的点 39 { 40 vis[xx][yy]=1; 41 q.push((zkw){xx,yy}); 42 43 } 44 } 45 } 46 for(int i=1;i<=n;++i) 47 { 48 for(int j=1;j<=n;++j) 49 { 50 if(vis[i][j]==0 && a[i][j]!=1) a[i][j]=2; 51 } 52 } 53 for(int i=1;i<=n;++i) 54 { 55 for(int j=1;j<=n;++j) 56 { 57 cout<<a[i][j]<<" "; 58 } 59 printf("\n"); 60 } 61 }