三子连线题

给定一个棋盘棋子的坐标为(x, y)有效范围是[0, 18],输入其中两个棋子的坐标,找出是否存在第三个棋子,使得三个棋子连成一条线,返回第三个棋子的坐标

package firstexam;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

/**
 * @author Ji yongmei
 * @file null.java
 * @create 2022-10-13 22:06
 */
public class SanZiLianXian {
    private static int[] getPoint(int x1, int y1, int x2, int y2) {
        int[][] pos = swapPos(x1, y1, x2, y2);
        x1 = pos[0][0];
        y1 = pos[0][1];
        x2 = pos[1][0];
        y2 = pos[1][1];
        if (x1 == x2) {
            // 横相等
            return getHen(x1, y1, x1, y2);
        } else if (y1 == y2) {
            // 竖相等
            return getShu(x1, y1, x2, y2);
        } else if (((x1 > x2) && (y1 > y2)) || ((x2 > x1) && (y2 > y1))) {
            // 45度的情况
            return get45degree(x1, y1, x2, y2);
        } else {
            // 135度的情况
            return get135degree(x1, y1, x2, y2);
        }
    }
    public static int[][] swapPos(int x1, int y1, int x2, int y2) {
        int[][] pos = new int[][] {{x1, y1}, {x2, y2}};
        if (x1 > x2 || x1 == x2 && y1 > y2) {
            pos[0][0] = x2;
            pos[0][1] = y2;
            pos[1][0] = x1;
            pos[1][1] = y1;
        }
        return pos;
    }

    private static ArrayList<int[]> validList(ArrayList<int[]> list) {
        Iterator<int[]> iterator = list.iterator();
        while(iterator.hasNext()) {
            int[] target = iterator.next();
            if (target[0] > 18 || target[0] < 0 || target[1] > 18 || target[1] < 0) {
                iterator.remove();
            }
        }
        return list;
    }

    private static int[] getHen(int x1, int y1, int x2, int y2) {
        if ((y1 + y2) % 2 == 0) {
            return new int[]{x1, (y1 + y2) / 2};
        }
        else if (y2 - y1 == 1) {
            // 判断是加到上面还是下面,是否合法,考虑边界
            ArrayList<int[]> list = new ArrayList<>();
            list.add(new int[] {x1, y1 - 1});
            list.add(new int[] {x1, y2 + 1});
            return choosePoint(x1, y1, x2, y2, list);

        } else {
            return new int[] {-1, -1};
        }
    }

    private static int[] getShu(int x1, int y1, int x2, int y2) {
        if ((x1 + x2) % 2 == 0) {
            return new int[]{(x1 + x2) / 2, y1};
        }
        else if (x2 - x1 == 1) {
            // 判断是加到左边还是右边,是否合法,考虑边界
            ArrayList<int[]> list = new ArrayList<>();
            list.add(new int[] {x1 - 1, y1});
            list.add(new int[] {x2 + 1, y1});
            return choosePoint(x1, y1, x2, y2, list);

        } else {
            return new int[] {-1, -1};
        }
    }

    private static int[] get45degree(int x1, int y1, int x2, int y2) {
        if ((x1 + x2) % 2 == 0 && (y1 + y2) % 2 == 0) {
            return new int[] {(x1 + x2) / 2, (y1 + y2) / 2};
        }
        else if ((x2 - x1) == 1 && (y2 - y1) == 1) {
            ArrayList<int[]> list = new ArrayList<>();
            list.add(new int[] {x1 - 1, y1 - 1});
            list.add(new int[] {x2 + 1, y2 + 1});
            return choosePoint(x1, y1, x2, y2, list);
        }
        else {
            return new int[] {-1, -1};
        }
    }

    private static int[] get135degree(int x1, int y1, int x2, int y2) {
        if ((x1 + x2) % 2 == 0 && (y1 + y2) % 2 == 0) {
            return new int[]{(x1 + x2) / 2, (y1 + y2) / 2};
        } else if ((x2 - x1) == 1 && (y2 - y1) == -1) {
            ArrayList<int[]> list = new ArrayList<>();
            list.add(new int[] {x1 - 1, y1 + 1});
            list.add(new int[] {x2 + 1, y2 - 1});
            return choosePoint(x1, y1, x2, y2, list);
        }
        else {
            return new int[]{-1, -1};
        }
    }

    public static int[] choosePoint(int x1, int y1, int x2, int y2, ArrayList<int[]> list) {
        list = validList(list);
        if (list.size() == 0) return new int[] {-1, -1}; // 都不满足要求
        if (list.size() == 1) return new int[]{list.get(0)[0], list.get(0)[1]};
        Collections.sort(list, (o1, o2) -> {
            if (o1[0] != o2[0]) {
                return o1[0] - o2[0];
            }
            return o1[1] - o2[1];
        });
        return new int[]{list.get(0)[0], list.get(0)[1]};
    }

    public static void main(String[] args) {
        int[] point = getPoint(1, 0, 2, 0);
        for (int i = 0; i < point.length; i++) {
            System.out.print(point[i] + " ");
        }
        System.out.println();
        int[] point1 = getPoint(0, 0, 3, 3);
        for (int i = 0; i < point.length; i++) {
            System.out.print(point1[i] + " ");
        }
        System.out.println();

        int[] point2 = getPoint(2, 1, 1, 0);
        for (int i = 0; i < point2.length; i++) {
            System.out.print(point2[i]+ " ");
        }
        System.out.println();
        int[] point3 = getPoint(1, 17, 0, 18);
        for (int i = 0; i < point3.length; i++) {
            System.out.print(point3[i]+ " ");
            // 216
        }
        System.out.println();
        int[] point4 = getPoint(18, 0, 17, 1);
        for (int i = 0; i < point4.length; i++) {
            System.out.print(point4[i]+ " ");
            // 162
        }
        System.out.println();
        int[] point5 = getPoint(18, 17, 17, 18);
        for (int i = 0; i < point5.length; i++) {
            System.out.print(point5[i]+ " ");
            // -1 -1
        }
        System.out.println();
        int[] point6 = getPoint(0, 17, 1, 18);
        for (int i = 0; i < point6.length; i++) {
            System.out.print(point6[i] + " ");
            // -1 -1
        }

        System.out.println();
        int[] point7 = getPoint(0, 0, 1, 1);
        for (int i = 0; i < point7.length; i++) {
            System.out.print(point7[i] + " ");
            // 2 2
        }

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flash连线源代码2.0是一款用于制作连线的源代码工具,它可以帮助用户快速创建各种不同类型的连线目。这款工具拥有强大的功能和简单易用的界面,可以满足用户各种不同的需求。 用户可以通过Flash连线源代码2.0轻松创建各种复杂的连线目,比如对应图片和文字、对应图形和图形、对应问和答案等。同时,用户也可以自定义目的样式、配色、目数量和难度等,使得每道目都能满足用户的需求。 Flash连线源代码2.0还提供了丰富的交互功能,比如用户可以在答过程中自动检查答案、展示正确答案、显示解析等。这些功能可以帮助用户更好地理解和掌握连线目的知识点,提高学习效率。 另外,Flash连线源代码2.0还支持多种输出格式,用户可以将制作好的目导出为图片、PDF、PPT等格式,方便用户在不同场景下使用。同时,用户还可以将制作好的目直接上传到网站或学习平台上,与其他用户分享和交流。 总的来说,Flash连线源代码2.0是一款功能强大、操作简单的连线源代码工具,它能够帮助用户快速创建各种目,并且提供丰富的交互功能和多种输出格式,更好地满足用户的需求。无论是教育培训机构还是个人用户,都可以通过这款工具轻松制作出高质量的连线目,提高学习效率和趣味性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值