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