蓝桥杯:连连看

蓝桥杯:连连看_第1张图片

本题大意要我们在一个给定的nxm的矩形数组中找出符合条件的格子

条件如下:

               1.数值相同

               2.两个横坐标和纵坐标的差值相等(由此可得是一个对角线上的格子)

那么根据以上条件我们可以用HashMap来解决这个问题,统计对角线上数值相同的格子有几个。

以下是代码的实现:(getOrDefault解决数组中没有这个key的情况。)记得输出的时候乘2因为双向统计

package 连连看;

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    static int[][] a=new int[1001] [1001];
    static long result=0;
    static int n,m ;

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n =scanner.nextInt();
        m =scanner.nextInt();


        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <=m ; j++) {

                a[i][j]=scanner.nextInt();

            }

        }
        for (int i = 1; i <=n ; ++i) {
            //先处理从左上到右下角的对角线
            g_l(i,1);
            g_r(i,1);

        }
        for (int i = 2; i <=m ; ++i) {
            //先处理从左上到右下角的对角线
            g_l(1,i);
            g_r(n,i);

        }
        System.out.println(result*2);

    }

    static void g_l(int x, int y) {
        HashMap hm=new HashMap<>();
        while (x<=n&&y<=m)
        {
            result+=hm.getOrDefault(a[x][y],0);
            hm.put(a[x][y],hm.getOrDefault(a[x][y],0)+1);
            x++;
            y++;


        }


    }
    //从左下角到右上角的对角线
    static void g_r(int x, int y) {
        HashMap hm=new HashMap<>();
        while (x>0&&y<=m)
        {
            result+=hm.getOrDefault(a[x][y],0);
            hm.put(a[x][y],hm.getOrDefault(a[x][y],0)+1);
            x--;
            y++;


        }

    }
}

你可能感兴趣的:(蓝桥杯,java,算法)