洛谷 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 }

 

posted @ 2020-05-15 17:33  zkw666  阅读(177)  评论(0编辑  收藏  举报