F 题
我们用BFS,先扫一遍,遇到1就把坐标加入队列,然后逐个节点出列,检查四个对角方向有没有黑的,比如说左上有黑的,就把上面,左边染黑,又把被染黑的节点加入队列,如果之前就被染黑了的节点就不管他,一直到队列为空
#define ll long long
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n; cin>>n;
vector<vector<int>>nums(n,vector<int>(n,0));
pair<int,int>a;
queue<pair<int,int>>q;
for(int i=0;i<n;i++){
string s; cin>>s;
for(int j=0;j<n;j++){
if(s[j]=='1'){
nums[i][j]=1;
a.first=i; a.second=j;
q.push(a);
}
}
}
while(!q.empty()){
auto t=q.front();
int x=t.first,y=t.second;
q.pop();
if(x+1<n&&y-1>=0&&nums[x+1][y-1]==1){
if(nums[x+1][y]==0){
a.first=x+1;
a.second=y;
q.push(a);
}
if(nums[x][y-1]==0){
a.first=x;
a.second=y-1;
q.push(a);
}
nums[x+1][y]=1;
nums[x][y-1]=1;
}
if(x+1<n&&y+1<n&&nums[x+1][y+1]){
if(nums[x+1][y]==0){
a.first=x+1;
a.second=y;
q.push(a);
}
if(nums[x][y+1]==0){
a.first=x;
a.second=y+1;
q.push(a);
}
nums[x+1][y]=1;
nums[x][y+1]=1;
}
if(x-1>=0&&y-1>=0&&nums[x-1][y-1]==1){
if(nums[x-1][y]==0){
a.first=x-1;
a.second=y;
q.push(a);
}
if(nums[x][y-1]==0){
a.first=x;
a.second=y-1;
q.push(a);
}
nums[x-1][y]=1;
nums[x][y-1]=1;
}
if(x-1>=0&&y+1<n&&nums[x-1][y+1]){
if(nums[x-1][y]==0){
a.first=x-1;
a.second=y;
q.push(a);
}
if(nums[x][y+1]==0){
a.first=x;
a.second=y+1;
q.push(a);
}
nums[x-1][y]=1;
nums[x][y+1]=1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<nums[i][j];
}
cout<<endl;
}
return ;
}
int main(){
int t; cin>>t;
while(t--){
solve();
}
cout<<endl;
return 0;
}

京公网安备 11010502036488号