判断所有输入坐标点中上下左右都有坐标点的坐标点个数(不一定相邻)

题目:判断所有输入坐标点中上下左右都有坐标点的坐标点个数(不一定相邻)



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


用例一
在这里插入图片描述
用例二
在这里插入图片描述
用例三
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值