阿里笔试题破解八卦阵问题

题目如下:

八卦阵相传是诸葛亮创设的一种战斗队形和***,由八种阵势组成。为了方便,采用矩阵描述一个八卦阵,它由八个单阵组成,,每个单阵由多个兵力区域组成一种阵势,如图所示,其中数字为一个兵力区域的士兵个数。假设单阵与单阵之间兵力区域不会相邻,且单阵中兵力区域至少存在一个兵力相邻区域(注:相邻是指再其↖、正上、↗、正右、↘、正下、↙、正左八个方位与其相邻),请用最快的速度计算出八个单阵中的兵力(士兵个数)的最大值和最小值。

使用广度优先的算法BFS。洪水充填法。代码如下:

import java.util.Scanner;

public class Eighttactics {    //八卦阵
    //模拟队列
    //用两个二维的数组
    public  static int ans = 0;
    public static int maxnum = 0;
    public static int minNum = 0x3f3f3f3f;
    public static int sum;
    public static int []qx = new int[1000];
    public static int []qy = new int[1000];

    public static int check(int x ,int y ,int r,int [][] grid,int m,int n){
        if(x >= 0 && x<m && y >= 0 && y< n && grid[x][y] > 0)
        {
            sum += grid[x][y];
            grid[x][y] = 0;  //每个海水侵蚀的地方就要变为水 0
            // 队列入队
            qx[r] = x;
            qy[r] = y;
            ++r;   //队尾加一
        }
        return r;
    }

    public static void floodfill(int x,int y,int[][] grid,int m,int n){
        int h = 0;
        int r = 1;
        qx[h] = x;
        qy[h] = y;
        sum += grid[x][y];
        grid[x][y] = 0;
        while(h<r){         //[h,r)左开右闭
            r = check(qx[h]-1,qy[h],r,grid,m,n);
            r = check(qx[h]+1,qy[h],r,grid,m,n);
            r = check(qx[h],qy[h]-1,r,grid,m,n);
            r = check(qx[h],qy[h]+1,r,grid,m,n);
            r = check(qx[h]-1,qy[h]+1,r,grid,m,n);
            r = check(qx[h]+1,qy[h]+1,r,grid,m,n);
            r = check(qx[h]+1,qy[h]-1,r,grid,m,n);
            r = check(qx[h]-1,qy[h]+1,r,grid,m,n);
            h++;
        }
    }
    public int maxAndMin(int [][] grid) {       //非递归的方式
        if(grid.length == 0 || grid[0].length == 0)
            return 0;
        int m = grid.length;
        int n = grid[0].length;
        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(grid[i][j] > 0)
                {
                    sum = 0;
                    floodfill(i,j,grid,m,n);    //floodfill(0,0,grid);遍历每一个格子
                    if(maxnum < sum){
                        maxnum = sum;
                    }
                    if(minNum > sum)
                    {
                        minNum = sum;
                    }
                    ans++;       //返回孤岛或者八卦阵的个数
                }
            }
        }
        return ans;

    }


    //测试
    public static  void main(String [] args){
        Eighttactics s = new Eighttactics();

        Scanner ss=new Scanner(System.in);
        System.out.println("请输入八卦阵的行数与列数");
        int x=ss.nextInt();
        int y=ss.nextInt();
        int [][]awarry=new int[x][y];//初始化数组
        System.out.println("请输入八卦阵元素");
        for(int i=0;i<x;i++)//循环输入
            for(int j=0;j<y;j++)
                awarry[i][j]=ss.nextInt();
        System.out.println("你输入的八卦阵为");
        for(int i=0;i<x;i++) {//循环输出
            for (int j = 0; j < y; j++)
                System.out.print(awarry[i][j] + "\t");
            System.out.println();
        }
        /*int max = 0;
        int min = 0x3f3f3f3f;*/
        //int [][] grid = {{1,1,0,0},{1,1,0,1},{1,0,0,1},{1,1,1,1}};
        //int [][] grid2 = {{1,0,3,3},{0,0,1,0},{1,1,0,1},{0,0,0,1}}; 测试用例
        //System.out.println(s.numIslands(grid));

       // System.out.println(s.numIslands(grid2));
        System.out.println(s.maxAndMin(awarry));  //ans为八卦阵的数量,比为8 否则不叫八卦阵

        System.out.println("最大兵力值:"+ maxnum);
        System.out.println("最小兵力值:"+ minNum);
    }
}

运行结果如下:


与题目测试范例结果一致:


全部评论

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
1 3 评论
分享
牛客网
牛客企业服务