题目:判断所有输入坐标点中上下左右都有坐标点的坐标点个数(不一定相邻)
import java.util.Scanner;
public class Mainmeitan {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 坐标点的总个数
int x[] = new int[n];// 存放坐标点的横坐标
int y[] = new int[n];// 存放坐标点的纵坐标
for (int i = 0; i < n; i++) {// 初始化所有坐标点
x[i] = scanner.nextInt();
y[i] = scanner.nextInt();
}
int count = 0;// 最终符合要求的坐标点的个数
boolean flag1 = false, flag2 = false, flag3 = false, flag4 = false;// 左右,上下标志:true:存在点,false:不存在点
for (int i = 0; i < n; i++) {// 判断第i个坐标点是否符合要求
for (int j = 0; j < n; j++) {
if (x[i] == x[j] && y[i] == y[j]) {// 当前点,不进行位置比对判断,跳过
continue;
}
if (y[i] == y[j]) {// 纵坐标相同,即同一行
if (x[i] > x[j]) {// 左边存在坐标点
flag1 = true;
}
if (x[i] < x[j]) {// 右边存在坐标点
flag2 = true;
}
}
if (x[i] == x[j]) {// 横坐标相同,即同一列
if (y[i] < y[j]) {// 上边存在坐标点
flag3 = true;
}
if (y[i] > y[j]) {// 下边存在坐标点
flag4 = true;
}
}
}
if (flag1 && flag2 && flag3 && flag4) {// 四个方向都存在点,则符合要求,总数加一
count++;
}
flag1 = flag2 = flag3 = flag4 = false;// 重新置反,进行判断
}
System.out.println(count);
}
}
*****************************************************************************************************
简单优化
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 坐标点的总个数
int x[] = new int[n];// 存放坐标点的横坐标
int y[] = new int[n];// 存放坐标点的纵坐标
for (int i = 0; i < n; i++) {// 初始化所有坐标点
x[i] = scanner.nextInt();
y[i] = scanner.nextInt();
}
int count = 0;// 最终符合要求的坐标点的个数
boolean flag1 = false, flag2 = false, flag3 = false, flag4 = false;// 左右,上下标志:true:存在点,false:不存在点
for (int i = 0; i < n; i++) {// 判断第i个坐标点是否符合要求
for (int j = 0; j < n; j++) {
if (x[i] == x[j] && y[i] == y[j]) {// 当前点,不进行位置比对判断,跳过
continue;
}
if (y[i] == y[j] && !(flag1 && flag2)) {// 纵坐标相同,即同一行,左右存在点,就不再往下判断
if (x[i] > x[j] && !flag1) {// 左边存在坐标点
flag1 = true;
}
if (x[i] < x[j] && !flag2) {// 右边存在坐标点
flag2 = true;
}
}
if (x[i] == x[j] && !(flag3 && flag4)) {// 横坐标相同,即同一列,上下存在点,就不再往下判断
if (y[i] < y[j] && !flag3) {// 上边存在坐标点
flag3 = true;
}
if (y[i] > y[j] && !flag4) {// 下边存在坐标点
flag4 = true;
}
}
}
if (flag1 && flag2 && flag3 && flag4) {// 四个方向都存在点,则符合要求,总数加一
count++;
}
flag1 = flag2 = flag3 = flag4 = false;// 重新置反,进行判断
}
System.out.println(count);
}
}
*****************************************************************************************************
利用标记数组
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 坐标点的总个数
int x[] = new int[n];// 存放坐标点的横坐标
int y[] = new int[n];// 存放坐标点的纵坐标
for (int i = 0; i < n; i++) {// 初始化所有坐标点
x[i] = scanner.nextInt();
y[i] = scanner.nextInt();
}
int count = 0;// 最终符合要求的坐标点的个数
int flag[] = new int[4];//标记数组,代表上下左右四个方位是否符合要求
for (int i = 0; i < n; i++) {// 判断第i个坐标点是否符合要求
for (int j = 0; j < n; j++) {
if (x[i] == x[j] && y[i] == y[j]) {// 当前点,不进行位置比对判断,跳过
continue;
}
if (y[i] == y[j] && !(flag[0] == 1 && flag[1] == 1)) {// 纵坐标相同,即同一行
if (flag[0] == 0 && x[i] > x[j]) {// 左边存在坐标点
flag[0] = 1;
}
if (flag[1] == 0 && x[i] < x[j]) {// 右边存在坐标点
flag[1] = 1;
}
}
if (x[i] == x[j] && !(flag[2] == 1 && flag[3] == 1)) {// 横坐标相同,即同一列
if (flag[2] == 0 && y[i] < y[j]) {// 上边存在坐标点
flag[2] = 1;
}
if (flag[3] == 0 && y[i] > y[j]) {// 下边存在坐标点
flag[3] = 1;
}
}
}
int add = flag[0] + flag[1] + flag[2] + flag[3];
if (add == 4) {// 四个方向都存在点,则符合要求,总数加一
count++;
}
flag[0] = flag[1] = flag[2] = flag[3] = 0;// 重新置反,进行判断
}
System.out.println(count);
}
}
*****************************************************************************************************
运行校验:
用例1:
输入:
8
0 0
0 1
0 2
0 3
1 1
1 2
-1 1
-1 2
输出:
2
用例2:
输入:
16
0 0
0 1
0 2
0 3
1 0
1 1
1 2
1 3
2 0
2 1
2 2
2 3
3 0
3 1
3 2
3 3
输出:
4
用例3:
输入:
17
-3 1
-2 -1
-2 2
-1 -2
-1 1
-1 2
-1 4
0 -2
0 -1
0 1
0 3
2 -1
2 1
2 2
2 3
3 1
3 2
输出:
6
用例一
用例二
用例三