学习柯学 @ 2023-03-28 19:48:24
#include<bits/stdc++.h>
using namespace std;
long long a[1005][1005], j, n, x1, y2, f;
int dpx[4]={0,0,1,-1};
int dpy[4]={1,-1,0,0};
int dfs(long long x,long long y)
{
a[x][y]=2;
for(int i=0;i<4;i++)
{
if(a[x+dpx[i]][y+dpy[i]]==0)
{
dfs(x+dpx[i],y+dpy[i]);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]==0&&a[i][j-1]==1&&f==0)
{
x1=i;
y2=j;
f=1;
}
}
}
dfs(x1,y2);
for(int i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
by some_ICE_ANK @ 2023-03-28 20:07:08
加上判断,防止数组越界
数组开31就够了
而且可以先判断这个点是不是暴露在边缘或与暴露在边缘的点相邻
如果不是,且这个点为0,输出2
AC代码:
#include<iostream>
using namespace std;
int a[501][501];
int n;
int vis[501][501];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
void dfs(int x,int y){
a[x][y]=9;
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=1 && xx<=n && yy>=1 && yy<=n && vis[xx][yy]!=1 && a[xx][yy]==0){
vis[xx][yy]=1;
dfs(xx,yy);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
if(a[i][1]==0){
a[i][1]=9;
dfs(i,1);
}
if(a[i][n]==0){
a[i][n]=9;
dfs(i,n);
}
if(a[1][i]==0){
a[1][i]=9;
dfs(1,i);
}
if(a[n][i]==0){
a[n][i]=9;
dfs(n,i);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==9){
cout<<"0 ";
continue;
}
if(a[i][j]==0){
cout<<"2 ";
}else{
cout<<a[i][j]<<' ';
}
}
cout<<endl;
}
return 0;
}