相邻区域

发布于 2021-10-23  85 次阅读


还是XDOJ的题……虽然我跟XD没什么关系

问题描述

一个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

代码

#include <stdio.h>
int main(void)
{
    int n,m,t,k;
    int i,j;
    int a,b;
    scanf("%d %d %d %d",&n,&m,&t,&k);
    int input[n+2][m+2];
    int c0[4][m]={0};
    for(i=0;i<m+2;i++)
    {
        input[0][i]=0;
        input[n+1][i]=0;
    }   
    for(i=0;i<n+2;i++)
    {
        input[i][0]=0;
        input[i][m+1]=0;
    }
    for(i=1;i<n+1;i++)
    {
        for(j=1;j<m+1;j++)
        {
            scanf("%d",&input[i][j]);
        }
    }
    int x1,y1,x2,y2;
    for(i=1;i<n+1;i++){
        for(j=1;j<m+1;j++){
            if(input[i][j]==k&&input[i-1][j]!=k&&input[i][j-1]!=k)
            y1=i,x1=j;
            if(input[i][j]==k&&input[i-1][j]!=k&&input[i][j+1]!=k)
            y1=i,x2=j;
            if(input[i][j]==k&&input[i+1][j]!=k&&input[i][j-1]!=k)
            y2=i,x1=j;
            if(input[i][j]==k&&input[i+1][j]!=k&&input[i][j+1]!=k)
            y2=i,x2=j;
        }
    }
    b=0;
    for(a=x1;a<=x2;a++){
        c0[0][b]=input[y1-1][a];
        c0[1][b]=input[y2+1][a];
        b++;
    }
    b=0;
    for(a=y1;a<=y2;a++){
        c0[2][b]=input[a][x1-1];
        c0[3][b]=input[a][x2+1];
        b++;
    }
    int num=0,count=0;
    RESTART:num++;
    if(num>t)
    {
        goto END;
    }
    for(a=0;a<4;a++)
    {
        for(b=0;c0[a][b]!=0;b++)
        {
            if(c0[a][b]==num)
            {
                count++;
                goto RESTART;
            }
        }   
    }
    goto RESTART;
    END:printf("%d",count);
    return 0;
}