看了一下其他dalao的因该没和我一样的吧
bfs不是太会,所以就用了dfs。
题目大意
我们从(0.0)开始搜索,因为我们需要寻找的0都是被1所包裹的,我们不妨将1外面的0全部变为数字3,然后输出时只需要进行判断如果是3就输出0,如果是0就输出2,如果是1就输出1。
主要就是如何遍历整个数组,将1外面的0变为3,我们就可以利用dfs,一个个去遍历。遇到a[i][j]=1时就返回。
其实其中还有一个比较细节的地方就是我给它扩大了一圈。
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
就是在此基础上给他们外围全部再加上一圈0
因为在我们搜索时,如果不加这一圈,我们很有可能就被1所挡住,而无法搜索到下面的,所以加了一圈,可以让我们绕过去,继续搜索。
参考代码
#include<cstdio>
#include <iostream>
#include<queue>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int a[35][35],dp[35][35];
void dfs(int x,int y)
{
if(x<0||y<0||x>n+1||y>n+1||dp[x][y]==1||a[x][y]==1)//(就是判断是否可以进行下一步,判断是否越界,以及是否碰到1)
{
return ;
}
else
{
dp[x][y]=1;
a[x][y]=3;
}
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y+1);
dfs(x,y-1);
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
cin>>a[i][j];
}
}
dfs(0,0);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(a[i][j]==3)//(这就是进行转换)
{
cout<<0<<" ";
}
else if(a[i][j]==0)
{
cout<<2<<" ";
}else
{
cout<<a[i][j]<<" ";
}
}
cout<<endl;
}
}