洛谷 P5198 [USACO19JAN]Icy Perimeter S题解

题目P5198 [USACO19JAN]Icy Perimeter S

题目大意:
给出一个由.#组成的二维矩阵,每一个连通块都有一个面积和周长,求面积最大的连通块的面积和周长,若有多个面积一样大的,输出周长最小的那个。
解题思路:
根据题意,二维矩阵中最大的#连通块即为我们所求的面积,这个很好求,只要深搜或广搜。难点是理解周长的含义(不知道你有没有理解为什么案例的周长为22)。看下图(懒得画图了,来源题目的讨论区),这是我数的周长8+9=17。注意超出边界的地方也是我们要算的周长。
在这里插入图片描述
但实际上周长是这样的:
在这里插入图片描述
也就是说有的重复的.我们也要算。
代码:
DFS:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1000;
const int dx[] = {
    0,1,0,-1 }, dy[] = {
    1,0,-1,0 };
int n, vis[maxn][maxn], map[maxn][maxn],area, perimeter, maxarea, maxperimeter;;
bool isValid(int x, int y) {
   
	if (x<1 || x>n || y<1 || y>n) {
   
		return false;
	}
	return true;
}

inline void DFS(int x, int y) {
   
	if (vis[x][y]||!isValid(x,y)||map[x][y]==0) {
   
		return;//这个点不是#、访问过、不合法就return.
	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值