hiho一下 第159周 区域周长

来源:互联网 发布:软件专业论文题目 编辑:程序博客网 时间:2024/06/06 14:05

题目1 : 区域周长

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个包含 N × M 个单位正方形的矩阵,矩阵中每个正方形上都写有一个数字。

对于两个单位正方形 a 和 b ,如果 a 和 b 有一条共同的边,并且它们的数字相等,那么 a 和 b 是相连的。

相连还具有传递性,如果 a 和 b 相连,b 和 c 相连,那么 a 和 c 也相连。

给定一个单位正方形 ss 和与 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 的矩阵 AAij 表示相应的正方形上的数字。(0 ≤ Aij ≤ 100)

输出

输出一个整数表示 R 的周长。

样例输入
6 5 2 10 0 1 2 23 1 1 3 74 3 1 3 74 3 0 3 24 3 3 0 14 5 5 5 5
思路:用dfs求正方形的个数。同时求相交的边的个数offset

package hihocoder;
import java.util.*;
//https://hihocoder.com/contest/hiho159/problem/1
public class quyuzhouchang {


public static void main(String[] args) {
// TODO Auto-generated method stub


Scanner sc=new Scanner(System.in);
String[] s1=sc.nextLine().split("\\s+");
int n=Integer.parseInt(s1[0]);
int m=Integer.parseInt(s1[1]);
int x=Integer.parseInt(s1[2]);
int y=Integer.parseInt(s1[3]);
int[][] nums=new int[n][m];
for(int i=0;i<n;i++){
String[] s=sc.nextLine().split("\\s+");
for(int j=0;j<m;j++){
nums[i][j]=Integer.parseInt(s[j]);
}
}
sc.close();
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// System.out.print(nums[i][j]+" ");
//
// }
// System.out.println();
// }
helper(nums,x,y);
}
static int offset=0;
private static void helper(int[][] nums,int x,int y){
boolean[][] flag=new boolean[nums.length][nums[0].length];
int n=flag.length;
int m=flag[0].length;
//        int[] res=dfs(flag,nums,x,y);
//        System.out.println(res[0]+" "+ res[1]);
        //System.out.println(4*res[0]-res[1]);
int c1=dfs(flag,nums,x,y);
int c2=offset;
//        System.out.println(c1+" "+c2);
        System.out.println(4*c1-c2);
        
        
//        for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// System.out.print(flag[i][j]+" ");
//
// }
// System.out.println();
// }
}

private static int dfs(boolean[][] flag,int[][] nums,int x,int y){
int area=0;
int n=flag.length;
int m=flag[0].length;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
flag[x][y]=true;
area++;


for(int v=0;v<4;v++){
int _x=x+dx[v];
int _y=y+dy[v];
if(_x>=0 && _x<n && _y>=0 && _y<m && nums[_x][_y]==nums[x][y] ){
offset++;
if( flag[_x][_y]==false){
area+=dfs(flag,nums,_x,_y);
}

// res[0]+=dfs(flag,nums,_x,_y)[0];
// res[1]+=dfs(flag,nums,_x,_y)[1];
// System.out.println(res[0]+ " "+res[1]+ " "+_x+" "+_y);


}
}
// System.out.println(area);
return area;
}


}
原创粉丝点击