1 条题解
-
27
转变思路
其实这题很简单,我们只要用一个深搜(广搜)即可,只不过需要一点变化。
-
我第一时间想到的是在(1,1)处用一个深搜。
-
因为1内部的点很难找,外部的点还不好找吗?
-
将深搜搜到的地方都变成一,如果遇到1(墙)就不搜。但是,这个想法不到10秒就被我否决了,为什么呢?
-
我用第一个测试点举例:
0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0
显然,这个方法过不了这个测试点,因为墙外(1)的部分不止一个,所以不行。
- 难道我们这个思想错了吗?不,只要变换一下就可以了。我们可以把第一个样例变成这样:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 难道我们这个思想错了吗?不,只要变换一下就可以了。我们可以把第一个样例变成这样:
这是不是就可以了,对,我们只要在输入样例的外围加一圈0,就可以将分开的外围块连起来。用我们这个思想就可以解这题。
- 所以这道题目我们只用深搜(广搜)就可以解决。
AC代码(求赞)
#include <bits/stdc++.h> using namespace std; bool a[12][12]; int cnt; int fx[5]={0,1,0,0,-1}; int fy[5]={0,0,-1,1,0}; void dfs(int x,int y) {//标准的深搜 a[x][y]=1; for (int i=1;i<=4;i++) { int nx=x+fx[i]; int ny=y+fy[i];//模拟往4个方向搜寻的过程。 if (nx>=0 && ny>=0 && nx<=11 && ny<=11 && !a[nx][ny]) {//标准的边界判断+判断是否遇到墙 a[nx][ny]=1;//将能走到的地方变为1。 dfs(nx,ny); } } } int main() { for (int i=1;i<=10;i++){ for (int j=1;j<=10;j++){ cin>>a[i][j]; } }//输入数据。 //由于我们只输入了1-10行1-10列,所以, //第0行0列、11行11列就是我们加的。 dfs(0,0);//深搜。 //此时,外围的0已经全部变为1了,所以,剩下的,只有内部的0。 for (int i=1;i<=10;i++){ for (int j=1;j<=10;j++){ if (!a[i][j]) cnt++;//因为只剩内部的0,外部的0都变成1了,所以,统计0的个数即可。 } } cout<<cnt;//输出0的个数。 return 0; }
-
- 1
信息
- ID
- 2056
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 118
- 已通过
- 75
- 上传者