P1162 填涂颜色
搜索一直是弱项,要么想不到,要么想到不会写emmm
这道题用到bfs(队列),也是看了视频才会哒哒哒
1、添加两行0(原1-n,现0-n+1),这样图就是连续的了,也就是可以遍历到环外所有的0!但输入时只输入1-n的即可
2、遍历(貌似是模版了...)
(1)把第一个元素放入队列里,标记
(2)外层while循环,取队头元素的坐标,出队。四个方向走(涉及两个增量数组:dx[4],dy[4])
(3)对于每个方向:判出界;如果没被标记且值为0,也就是环外0,就改变其mark值,同时入队
3、根据mark值及数组值,进行输出。记得输出换行符
//大概懂了吧...
//添加两行,变为连续图;bfs遍历所有0(也就是环外的),将其进行标记为1
#include<bits/stdc++.h>
using namespace std;
struct point{
int x,y;
};
queue<point> q;
//增量数组,四个方向
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,mark[35][35]={0},a[35][35]={0};
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
// 将该点标记为已访问
mark[0][0]=1;
q.push({0,0});
while(!q.empty()){
point p=q.front();
q.pop();
// bfs遍历
for(int i=0;i<4;i++){
int x=p.x+dx[i];
int y=p.y+dy[i];
// 越界判断
if(x>n+1||x<0||y>n+1||y<0) continue;
// 1不会被放入队列里,也就不会往里进行遍历,所以该bfs只遍历了环外的元素
if(mark[x][y]==0&&a[x][y]==0) {
mark[x][y]=1;
q.push({x,y});
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mark[i][j]==0&&a[i][j]==0) cout<<"2"<<" ";
if(mark[i][j]==1&&a[i][j]==0) cout<<"0"<<" ";
if(a[i][j]==1) cout<<"1"<<" ";
if(j==n) cout<<endl;
}
}
}

浙公网安备 33010602011771号