#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;
}