Image Perimeters
求连通块的周长,这里用的深搜实现,做了一些深搜的题了,还是感觉深搜没有广搜那么自然,因为涉及到递归,理解起来更加困难一些,还是需要加强该方面的训练!
这一道题卡了不少时间,先看代码:
//深搜;求连通块的周长(输入保证没有“空心”)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m, a, b;
struct g {//存储格子坐标
int x, y;
};
int vis[30][30];
char map[30][30];
int ans;
int dx[] = { 0,0,1,-1,1,-1,1,-1 };
int dy[] = { 1,-1,1,-1,-1,1,0,0 };
void dfs(g t) {
int cnt = 4;//!!!!!!!!!必须在这里定义!!(我也不知道为什么,搞死我了)
if (vis[t.x][t.y]) return;
vis[t.x][t.y] = 1;
for (int i = 0;i < 8;i++) {
g p;
p.x = t.x + dx[i];
p.y = t.y + dy[i];
//分开“筛选”,是为了保证 map 不越界
if (p.x<1 || p.y<1 || p.x>m || p.y>n) continue;
if (map[p.x][p.y] != 'X') continue;
dfs(p);//“筛选”完后到这里的是满足条件的点
if (dx[i] == 0 || dy[i] == 0) cnt--;//核心部分,对于每一个方块,有邻接的自身贡献的周长减一
}
ans += cnt;
}
int main() {
while (cin >> m >> n >> a >> b && (m || n || a || b)) {
for (int i = 1;i <= m;i++) {
for (int j = 1;j <= n;j++) cin >> map[i][j];
}
memset(vis, 0, sizeof(vis));
ans = 0;
g start;
start.x = a;start.y = b;
dfs(start);
cout << ans << endl;
}
return 0;
}
卡在哪里了呢?有关 cnt 的声明int cnt = 4;
一开始设置成了全局变量,竟然得不到正确结果?!找 bug 找了好长时间,到现在也不明白是为什么。。。我感觉这在 dfs 函数体里面已经赋值了这影响在哪里呢?我现在能想到的就是说每一个 cnt 只与当前层递归有关,设置成全局的话会影响不同的层,从而带来偏差,这个细节真的是绝了,也是我太嫩了吧。。
为了这个小细节心态差一点崩了,还是要学会调整自己的心理素质,现在天也挺热的,容易浮躁,更应该保持冷静,一步步地往前走,不怕慢,就怕三天打鱼两天晒网,以后这应该也是家常便饭了:要具备冷静调试代码的能力!!加油!!