当前位置: 代码迷 >> 综合 >> 相邻区域-xdoj
  详细解决方案

相邻区域-xdoj

热度:44   发布时间:2023-12-06 09:19:24.0

标题        

相邻区域

类别        

数组

时间限制       

1S

内存限制       

256Kb

问题描述       

一个n行m列的矩阵被划分成t个矩形区域,分别用数字1-t来标识,同一个区域内的元素都用同一个数字标识。如下图所示,一个6行8列的矩阵被分成8个矩形区域,分别用编号1-8标识。当两个小区域之间公用一条边时,称这两个区域相邻,例如下图中区域5的相邻区域有6个,分别为1,2,3,6,7,8,但4并不是它的相邻区域。请写一个程序找出区域k的所有相邻区域。

输入说明       

输入第一行为四个整数n,m, t,k,整数之间用空格分隔。n表示矩阵行数(n<20),m表示矩阵列数(m<20),t表示矩阵被划分为t个矩形区域(0<t<50),k为其中某个区域的编号(1<=k<=t)。接下来是n行数据,每行m个整数,表示矩阵内各个元素所在的区域,整数之间用空格分隔。

输出说明       

输出为一个整数,表示与k相邻的区域个数

输入样例       

6 8 8 5

1 1 2 2 2 3 3 4

1 1 2 2 2 3 3 4

1 1 2 2 2 3 3 4

1 1 5 5 5 5 5 6

1 1 5 5 5 5 5 6

7 7 7 7 7 8 8 8

输出样例       

6


解题思路:

(1)确定要判定区域的坐标(如:左上、右下或左下、右上);

(2)根据确定的坐标数据来判定该判定区域上、下、左、右相邻的区域数量。


#include<stdio.h>
int main()
{int n,m,t,k,i,j;int lui,luj,rdi,rdj,num,sum=0;int a[100][100];scanf("%d%d%d%d",&n,&m,&t,&k);for(i=0;i<n;i++){for(j=0;j<m;j++){scanf("%d",&a[i][j]);}}for(i=0;i<n;i++)//找左上 {num=0;for(j=0;j<m;j++){if(a[i][j]==k){lui=i;luj=j;num=1;break;}}if(num==1)break;}for(i=n-1;i>=0;i--)//找右下 {num=0;for(j=m-1;j>=0;j--){if(a[i][j]==k){rdi=i;rdj=j;num=1;break;}}if(num==1)break;}if(luj>0)//左边 {sum++;for(i=lui,j=luj-1;i<rdi;i++)if(a[i][j]!=a[i+1][j])sum++;} if(lui>0)//上边{sum++;for(j=luj,i=lui-1;j<rdj;j++)if(a[i][j]!=a[i][j+1])sum++;} if(rdj<m-1)//右边 {sum++;for(j=rdj+1,i=lui;i<rdi;i++)if(a[i][j]!=a[i+1][j])sum++;}if(rdi<n-1)//下边 {sum++;for(i=rdi+1,j=luj;j<rdj;j++)if(a[i][j]!=a[i][j+1])sum++;}printf("%d",sum);return 0;
}