Image Perimeters(真让人无语。。)

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 只与当前层递归有关,设置成全局的话会影响不同的层,从而带来偏差,这个细节真的是绝了,也是我太嫩了吧。。
为了这个小细节心态差一点崩了,还是要学会调整自己的心理素质,现在天也挺热的,容易浮躁,更应该保持冷静,一步步地往前走,不怕慢,就怕三天打鱼两天晒网,以后这应该也是家常便饭了:要具备冷静调试代码的能力!!加油!!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值