题解栏居!然!还!是!放!不!下!
题目大意:
一个方阵,由 0 0 0和 1 1 1组成,让我们把被 1 1 1围住的 0 0 0全部替换成 2 2 2。
解题思路:
B F S BFS BFS把所有没有被围住的 0 0 0标记出来,再把所有没被标记的 0 0 0替换成 2 2 2。
代码实现:
需要洛谷全AC图才可复制
#include<bits/stdc++.h>
using namespace std;
int a[35][35];
bool v[35][35];
int n;
queue<int>qx;
queue<int>qy;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool cheak(int x,int y){
return (x>=1&&x<=n&&y>=1&&y<=n&&!v[x][y]&&a[x][y]!=1);
}
void gs(int ax,int ay){
int x,y,tx,ty,i;
qx.push(ax);
qy.push(ay);
v[ax][ay]=1;
while (qx.size()){
x=qx.front();
y=qy.front();
qx.pop();
qy.pop();
for (i=0;i<4;i++){
tx=x+dx[i];
ty=y+dy[i];
if (cheak(tx,ty)){
qx.push(tx);
qy.push(ty);
v[tx][ty]=1;
}
}
}
}
int main(){
int i,j;
cin>>n;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
cin>>a[i][j];
}
}
for (i=1;i<n;i++){
if (a[i][1]==0){
gs(i,1);
}
if (a[i][n]==0){
gs(i,n);
}
if (a[1][i]==0){
gs(1,i);
}
if (a[n][i]==0){
gs(n,i);
}
}
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
if (a[i][j]!=1&&!v[i][j]){
a[i][j]=2;
}
cout<<a[i][j]<<' ';
}
puts("");
}
}
祝你AC!