题目地址:http://hihocoder.com/problemset/problem/1319
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
6 5 2 1 0 0 1 2 2 3 1 1 3 7 4 3 1 3 7 4 3 0 3 2 4 3 3 0 1 4 5 5 5 5
样例输出
-
10
描述
给定一个包含 N × M 个单位正方形的矩阵,矩阵中每个正方形上都写有一个数字。
对于两个单位正方形 a 和 b ,如果 a 和 b 有一条共同的边,并且它们的数字相等,那么 a 和 b 是相连的。
相连还具有传递性,如果 a 和 b 相连,b 和 c 相连,那么 a 和 c 也相连。
给定一个单位正方形 s,s 和与 s 相连的所有单位正方形会组成一个区域 R 。小Hi想知道 R 的周长是多少?
输入
第一行包含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)
输出
输出一个整数表示 R 的周长。
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
int y=in.nextInt()+1;
int x=in.nextInt()+1;
int ecount=0;
int[] xa ={0,0,-1,1};
int[] ya={-1,1,0,0};
Queue<Integer> q=new ArrayDeque<Integer>();
int[][] map=new int[m+5][n+5];
int[][] vis=new int[m+5][n+5];
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
map[i][j]=in.nextInt()+1;
}
}
q.add(new Integer(y*n+x));
while(!q.isEmpty()){
int temp=q.poll().intValue();
int xx=(temp-1)%n+1;
int yy=(temp-1)/n;
if(vis[yy][xx]==1){
continue;
}
vis[yy][xx]=1;
int key=map[yy][xx];
int count=4;
for(int i=0;i<4;i++){
int x1=xx+xa[i];
int y1=yy+ya[i];
if(map[y1][x1]==key){
if(vis[y1][x1]==0){
q.add(new Integer(y1*n+x1));
}
else{
count-=2;
}
}
}
ecount+=count;
}
System.out.println(ecount);
}
}