DFS - hihoCoder#159 - 区域周长

#1319 : 区域周长

 

题意:给定一个N*M的矩阵,给定一个起始坐标x,y,求与(x,y)相邻且值相同的联通快的周长。每个格子边长为1。

 

数据范围

第一行包含4个整数 N , M ,x 和 y , N 和 M 是矩阵的大小, x 和 y 是给定的单位正方形 s 的坐标。(1 ≤ N , M ≤ 100, 0 ≤ x < N , 0 ≤ y < M )

以下是一个 N × M 的矩阵 A,Aij 表示相应的正方形上的数字。(0 ≤ Aij ≤ 100)      下标从0开始

 

思路

很明显的DFS,求周长其实从题意可以发现,如果相邻的值相等,那么这两个点之间的边就不是外围的边;如果不相等,那么就算入周长。

 

官方题解

对于一个区域中的方格来说,它一共有上下左右四条长度为1边。其中某条边是边界的一部分当且仅当这条边另一侧的方格不是本区域的方格或者根本不存在(在地图之外)。所以在我们dfs的过程中,在从方格(i, j)尝试扩展到方格(_x, _y)时,可以顺便判断夹在(i, j)和(_x, _y)的之间的边是不是边界。如果是,我们就累计在变量ans中

 

代码

 

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int ma=105;
int mp[ma][ma];
bool vis[ma][ma];
int n,m,ans;

int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};

bool judge(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m) return false;
    return true;
}

void dfs(int x,int y)
{
    vis[x][y]=true;
    int ix,iy;
    for(int i=0;i<4;++i)
    {
        ix=x+dx[i];
        iy=y+dy[i];
        if(!vis[ix][iy])
        {
            if(judge(ix,iy))
            {
                ans++;
                continue;
            }
            if(mp[ix][iy]==mp[x][y])
            dfs(ix,iy);
            else ans++;
        }
    }
}

int main()
{
    int x,y;
    scanf("%d%d%d%d",&n,&m,&x,&y);
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j)
        scanf("%d",&mp[i][j]);

    memset(vis,false,sizeof(vis));
    ans=0;

    dfs(x,y);
    printf("%d\n",ans);

    return 0;
}

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值