{ }codelper
判断函数P0285

落在沙坑里的球

游乐场里有一个长方形沙坑,沙坑的四条边与横轴或纵轴平行。
第一行给出沙坑中相对的两个顶点的坐标 x1、y1、x2、y2,相邻两个数之间用一个空格隔开。
两个顶点中哪一个先给出并不固定,所以 x1 可能比 x2 大,y1 也可能比 y2 大。
第二行给出球的个数 n,接下来 n 行每行给出一个球落下位置的坐标 x、y,用一个空格隔开。
对每个球,如果落在沙坑里面或边线上,输出一行 "是";如果落在沙坑外面,输出一行 "否"。
球的 x 在 x1 和 x2 之间,并且 y 在 y1 和 y2 之间,就是在里面或边线上。
这里的“之间”包含两端的值。
请写一个函数,用真或假返回数 v 是否在两个数 a 和 b 之间(含两端),并在横向和纵向各用一次。

输入
-1,000 ≤ x1, y1, x2, y2 ≤ 1,000,x1 ≠ x2,y1 ≠ y2,1 ≤ n ≤ 100,-1,000 ≤ x, y ≤ 1,000(均为整数)
输出
n 行,每行 "是" 或 "否"
样例 1 · stdin
8 1 2 5
5
2 5
5 3
9 3
5 0
0 9
stdout
是
是
否
否
否
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

判断函数直接返回条件表达式就行,不必展开写成 if (条件) return true; else return false;。
返回类型:Python bool,JS、TS boolean,Java boolean,C# bool,C++ bool,C 用 <stdbool.h> 的 bool,Craykon 在 返回 后面写条件表达式。
同一个函数在横向和纵向各调用一次,用 &&(Python 是 and)连接。
四个陷阱:① 只有 Python 能直接写数学里的 a ≤ v ≤ b(low <= v <= high)。
JS 会不报错地接受 low <= v <= high,但把它读成 (low <= v) <= high,拿前一个比较的结果(0 或 1)去和 high 比。
所以 high 大于等于 1 时总是真。
C、C++ 也按同样的意思去读:gcc 会照常编译(加上 -Wall 才有警告),较新的 clang 则报错拦住。
Java 和 C# 因为布尔值不能和数比较而不予编译,TS 也用 TS2365 错误拦住,Craykon 也会提示不能连着写比较并拦住。
在这些语言里要拆成两个:low <= v && v <= high。
② 顶点可能以颠倒的顺序给出,所以先用 min(a, b) 和 max(a, b) 定出小的一端和大的一端(Craykon 数学.较小值、数学.较大值)。
样例中 x1 = 8 比 x2 = 2 大。
③ 边线上也算里面,所以是 <= 而不是 <。
④ 横向和纵向都要符合,所以是 && 而不是 ||。

Pythonmain.py · 13 行
def between(v, a, b):    """v가 a와 b 사이(양 끝 포함)에 있으면 True. a와 b는 어느 쪽이 커도 된다."""    return min(a, b) <= v <= max(a, b)  x1, y1, x2, y2 = map(int, input().split())n = int(input())for _ in range(n):    x, y = map(int, input().split())    if between(x, x1, x2) and between(y, y1, y2):        print("是")    else:        print("否")
JavaScriptmain.js · 14 行
// v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다function between(v, a, b) {  return Math.min(a, b) <= v && v <= Math.max(a, b);} const lines = require("fs").readFileSync(0, "utf8").split("\n");const [x1, y1, x2, y2] = lines[0].trim().split(/\s+/).map(Number);const n = Number(lines[1]);const out = [];for (let i = 0; i < n; i++) {  const [x, y] = lines[2 + i].trim().split(/\s+/).map(Number);  out.push(between(x, x1, x2) && between(y, y1, y2) ? "是" : "否");}console.log(out.join("\n"));
TypeScriptmain.ts · 16 行
import { readFileSync } from "node:fs"; // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다function between(v: number, a: number, b: number): boolean {  return Math.min(a, b) <= v && v <= Math.max(a, b);} const lines: string[] = readFileSync(0, "utf8").split("\n");const [x1, y1, x2, y2]: number[] = lines[0].trim().split(/\s+/).map(Number);const n: number = Number(lines[1]);const out: string[] = [];for (let i = 0; i < n; i++) {  const [x, y]: number[] = lines[2 + i].trim().split(/\s+/).map(Number);  out.push(between(x, x1, x2) && between(y, y1, y2) ? "是" : "否");}console.log(out.join("\n"));
JavaMain.java · 20 行
import java.util.Scanner; public class Main {    // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다    static boolean between(int v, int a, int b) {        return Math.min(a, b) <= v && v <= Math.max(a, b);    }     public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int x1 = sc.nextInt(), y1 = sc.nextInt(), x2 = sc.nextInt(), y2 = sc.nextInt();        int n = sc.nextInt();        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            int x = sc.nextInt(), y = sc.nextInt();            out.append(between(x, x1, x2) && between(y, y1, y2) ? "是" : "否").append('\n');        }        System.out.print(out);    }}
C#Main.cs · 27 行
using System; class Program{    // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다    static bool Between(int v, int a, int b)    {        return Math.Min(a, b) <= v && v <= Math.Max(a, b);    }     static int[] ReadInts()    {        return Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);    }     static void Main()    {        int[] r = ReadInts();        int n = ReadInts()[0];        for (int i = 0; i < n; i++)        {            int[] ball = ReadInts();            bool inside = Between(ball[0], r[0], r[2]) && Between(ball[1], r[1], r[3]);            Console.WriteLine(inside ? "是" : "否");        }    }}
C++main.cpp · 17 行
#include <algorithm>#include <iostream> // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다bool between(int v, int a, int b) {    return std::min(a, b) <= v && v <= std::max(a, b);} int main() {    int x1, y1, x2, y2, n;    std::cin >> x1 >> y1 >> x2 >> y2 >> n;    for (int i = 0; i < n; i++) {        int x, y;        std::cin >> x >> y;        std::cout << (between(x, x1, x2) && between(y, y1, y2) ? "是" : "否") << '\n';    }}
Cmain.c · 20 行
#include <stdbool.h>#include <stdio.h> // v가 a와 b 사이(양 끝 포함)에 있으면 true. a와 b는 어느 쪽이 커도 된다bool between(int v, int a, int b) {    int low = a < b ? a : b;    int high = a < b ? b : a;    return low <= v && v <= high;} int main(void) {    int x1, y1, x2, y2, n;    if (scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &n) != 5) return 0;    for (int i = 0; i < n; i++) {        int x, y;        if (scanf("%d %d", &x, &y) != 2) return 0;        puts(between(x, x1, x2) && between(y, y1, y2) ? "是" : "否");    }    return 0;}
Craykonmain.cray · 20 行
// v가 a와 b 사이(양 끝 포함)에 있으면 참. a와 b는 어느 쪽이 커도 된다사이인가(v, a, b){    返回 数学.较小值(a, b) <= v && v <= 数学.较大值(a, b);} r = 控制台.读数字();n = 控制台.读行().转数字();循环 (i = 0; i < n; i++){    ball = 控制台.读数字();    如果 (사이인가(ball[0], r[0], r[2]) && 사이인가(ball[1], r[1], r[3]))    {        控制台.输出("是");    }    否则    {        控制台.输出("否");    }}