阿里2018校招编程题

来源:互联网 发布:淘宝个体户营业执照 编辑:程序博客网 时间:2024/05/17 23:46

找朋友组队,输入一个N*N的二维数组,数组由0和1组成。第i行第j列的数据为1,表示i与j是朋友,可以一起组队,如M[1]和M[2],M[2]的朋友也可以加入到该队中,只要有朋友关系的都可以加入到同一对,而M[3]只能自己组队,因此最少需要组的对数是2.
M[1] = (1,1,0)
M[2] = (1,1,0)
M[3] = (0,0,1)

import java.util.*;public class Main {    static int findCircleNum(int[][] M) {        int num=0;        ArrayList F = new ArrayList();        for(int i=0;i<M.length;i++){            if(F.contains(i)){//如果i已经在已组队队列中了,直接跳出                break;            }            boolean flag = false;//用于判断i加入已组队序列是否是利用朋友关系进入一个队            for(int j=0;j<M[i].length;j++){                if(M[i][j]==1 && i!=j){                    if(F.contains(j)){  //判断i的朋友j是否已组队成功,是则跳出循环,因为i可以和j在同一个队,无需开一个新队                        F.add(i); //i组队成功,加入已组队序列                        flag = true;                        break;                    }                }                if(j == M[i].length-1){  //如果遍历到最后一个数,还没有组队成功,i开设一个新队,并加入已组队序列                    F.add(i);                }            }            if(flag==false){  //如果i的朋友都还没有组过队,则队数加一                num++;            }        }        return num;    }    public static void main(String[] args){        Scanner in = new Scanner(System.in);        int res;        int _M_rows = 0;        int _M_cols = 0;        _M_rows = Integer.parseInt(in.nextLine().trim());        _M_cols = Integer.parseInt(in.nextLine().trim());        int[][] _M = new int[_M_rows][_M_cols];        for(int _M_i=0; _M_i<_M_rows; _M_i++) {            String row_x=String.valueOf(in.nextLine().trim());            String[] row_y=row_x.split(",");            for(int _M_j=0; _M_j<_M_cols; _M_j++) {                _M[_M_i][_M_j] = Integer.parseInt(row_y[_M_j]);            }        }        if(in.hasNextLine()) {            in.nextLine();        }        res = findCircleNum(_M);        System.out.println(String.valueOf(res));    }}
原创粉丝点击