NYNY111 @ 2024-07-18 22:12:59
```c
int n;
int g[33][33];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs(){
for(int x=0;x<n;x++)
for(int y=0;y<n;y++){
if(!g[x][y]){
int nx,ny,flag=0;
for(int k=0;k<4;k++){
nx=x,ny=y;
while(nx>=0&&ny>=0&&nx<n&&ny<n){
nx+=dir[k][0];
ny+=dir[k][1];
if(g[nx][ny]>0){
flag++;
break;
}
}
if(flag==0)break;
}
if(flag==4)g[x][y]=2;
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&g[i][j]);
bfs();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",g[i][j]);
}
printf("\n");
}
return 0;
}
by Andlewzheyao @ 2024-07-19 21:16:22
你这个代码实在不太清晰,不过你这个bfs应该要用队列,你这个方法太容易错了,建议你用stl模板库,直接用queue就行了
方向数组建议用两个一维数组
你直接看我的代码就行了
代码如下
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,a[31][31];
ll dx[]={0,1,0,-1},dy[]={1,0,-1,0};
struct Node{
ll x,y;
};
queue<Node> q;
void print(){
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
if(j!=1) cout<<" ";
cout<<a[i][j];
}
cout<<endl;
}
}
void bfs(ll x,ll y){
a[x][y]=2;
q.push(Node{x,y});
while(!q.empty()){
Node f = q.front();
for(ll i=0;i<4;i++){
ll di=f.x+dx[i],dj=f.y+dy[i];
if(di>=1&&di<=n&&dj>=1&&dj<=n&&a[di][dj]==0){
a[di][dj]=2;
q.push(Node{di,dj});
}
}
q.pop();
}
}
int main(){
bool f=0;
cin>>n;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++) cin>>a[i][j];
ll x,y;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
if(a[i][j]==1){
x=i+1,y=j+1;
f=1;
break;
}
}
if(f) break;
}
bfs(x,y);
print();
return 0;
}
记得自己理解!!!!!!!!!!!!
by NYNY111 @ 2024-08-13 17:06:28
@Andlewzheyao 谢谢哈