欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2018头条笔试题-世界杯问题

程序员文章站 2022-06-22 11:14:36
题目: 输入如下面所示: 前一行是m行、n列 后面是这个m行n列的数据,从任意一个1出发,可上下、左右、斜角遍历 要求输出有多少个连通图、连通图中包含的最大连通个数。 10,10 0,0,0,0,0,0,0,0,0,0 0,0,0,1,1,0,1,0,0,0 0,1,0,0,0,0,0,1,0,1 ......

题目:

输入如下面所示:

前一行是m行、n列

后面是这个m行n列的数据,从任意一个1出发,可上下、左右、斜角遍历

要求输出有多少个连通图、连通图中包含的最大连通个数。

 

10,10

0,0,0,0,0,0,0,0,0,0

0,0,0,1,1,0,1,0,0,0

0,1,0,0,0,0,0,1,0,1

1,0,0,0,0,0,0,0,1,1

0,0,0,1,1,1,0,0,0,1

0,0,0,0,0,0,1,0,1,1

0,1,1,0,0,0,0,0,0,0

0,0,0,1,0,1,0,0,0,0

0,0,1,0,0,1,0,0,0,0

0,1,0,0,0,0,0,0,0,0

 

package algorithm;

import java.util.Scanner;

public class Toutiao {
    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
            String s1 = sc.next();
            String[] s1Arr= s1.split(",");
            int x = Integer.valueOf(s1Arr[0]);
            int y = Integer.valueOf(s1Arr[1]);
            int[][] a = new int[x][y];
            for(int i = 0; i < x; i++){
                String s = sc.next();
                String[] sArr = s.split(",");
                for(int j = 0;j<y;j++)
                    a[i][j]= Integer.valueOf(sArr[j]);
            }
            int rt[] = new int [2];
            rt=getCount(a,x,y);
        System.out.println(rt[0]);
        System.out.println(rt[1]);
    }
    
    public static int[] getCount(int[][] A,int x,int y) {
        int a[] = new int [2];
        int max =0;
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (A[i][j] == 1) {
                    a[0]++;
                    int count = 0;
                    pathcount =0;
                    erase(A, i, j,count);
                    if(pathcount >max)
                        max=pathcount;
                }
            }
        }
        
        a[1]= max;
        return a;
    }

    public static int  pathcount  =0;
    public static void erase(int[][] A, int i, int j,int count) {
        pathcount++;
        count++;
        A[i][j] = 0;
        while (i - 1 >= 0 && A[i - 1][j] == 1) {  //下
            erase(A, i - 1, j,count);
        }
        while (i + 1 < A.length && A[i + 1][j] == 1) {  // 上
            erase(A, i + 1, j,count); 
        }
        while (j - 1 >= 0 && A[i][j - 1] == 1) { //左
            erase(A, i, j - 1,count);
        }
        while (j + 1 < A[0].length && A[i][j + 1] == 1) { //右
            erase(A, i, j + 1,count);
        }
        while (i - 1 >= 0 && j-1 >=0 && A[i-1][j - 1] == 1) { //左上
            erase(A, i-1, j -1,count);
        }
        while (i + 1 < A.length && j+1 <A[0].length && A[i+1][j + 1] == 1) { //右下
            erase(A, i+1, j +1,count);
        }
        while (i - 1 >= 0 && j+1 <A[0].length && A[i-1][j + 1] == 1) { //右上
            erase(A, i-1, j +1,count);
        }
        while (i + 1 < A.length && j-1 >=0 && A[i+1][j - 1] == 1) { //左下
            erase(A, i+1, j -1,count);
        }
   
    }

}