每日消息!#yyds干貨盤點# 名企真題專題:交叉線

2022-12-08 18:22:41 來源:51CTO博客


(相關資料圖)

1.簡述:

描述

大M布置給小M一個題目:首先給出n個在橫坐標上的點,然后連續的用半圓連接他們:首先連接第一個點與第二點(以第一個點和第二點作為半圓的直徑)。然后連接第二個第三個點,直到第n個點。現在需要判定這些半圓是否相交了,在端點處相交不算半圓相交。如下圖所示。

輸入描述:

輸入的第一行包含一個整數T (1 ≤ T ≤ 10)表示有T組樣例。每組樣例的第一行是一個整數n (1≤n≤1000)。接下來的一行輸入有n個用空格隔開的不同的整數a1,a2,...,an (-1000000 ≤ ai ≤ 1000000),(ai,0)表示第i個點在橫坐標的位置。

輸出描述:

對于每個輸入文件,輸出T行。每行輸出"y"表示這些半圓有相交或者"n"。

示例1

輸入:

240 10 5 1540 15 5 10

輸出:

yn

2.代碼實現:

import java.util.*;public class Main{    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int T = in.nextInt();        while (T-- > 0){            int n = in.nextInt();//端點數            int[] arr = new int[n];            for (int i = 0; i < n; i++) {//輸入端點                arr[i] = in.nextInt();            }            List cir = new ArrayList<>();            for (int i = 0; i < n - 1; i++) {//儲存圓                int left = Math.min(arr[i],arr[i + 1]);//左端點                int right = Math.max(arr[i],arr[i + 1]);//右端點                cir.add(new int[]{left,right});            }            //題意為所有的圓都不存在相交,才返回false            boolean flag = false;            for (int i = 1; i < cir.size(); i++) {                for (int j = 0; j < i; j++) {                    //先設置兩個圓的端點                    int left1 = cir.get(i)[0],right1 = cir.get(i)[1];//圓1的端點                    int left2 = cir.get(j)[0],right2 = cir.get(j)[1];//圓2的端點                    //兩圓相交的情況                    if (left1 < left2 && right1 < right2 && right1 > left2){                        flag = true;                        break;                    }else if (left1 > left2 && left1 < right2 && right1 > right2){                        flag = true;                        break;                    }                }            }            if (flag){                System.out.println("y");            }else {                System.out.println("n");            }        }    }}

標簽: 是否相交 如下圖所示 輸入文件

上一篇:當前看點!軟件測試常用的8種功能測試類型
下一篇:今日報丨基于Qt的桌面客戶端組件化框架DT 開源啦