UVa: 1595 - Symmetry

本文探讨如何在平面上的点集中找到一条竖线,使得所有点左右对称。通过两种思路实现这一目标,包括计算对称轴并检查每个点的对称点是否存在,以及暴力枚举对称轴的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:给出平面上N(N<=1000)个点。问是否可以找到一条竖线,使得所有点左右对称,如图所示:


则左边的图形有对称轴,右边没有。

思路1:如点集存在对称轴,则对称轴为点集x坐标和的平均。然后用set存储每个点(输入点不同),遍历每一个点,通过求得的对称轴,计算它的对称点,若不存在则输出“NO”。
思路2:暴力枚举,如果存在对称轴的话那么对称轴的横坐标一定是最左边的点和最右边的点的中点   为了避免中点是小数  可以将横坐标都乘上2  然后在判断所有点是否有对称点就行了
下面实现思路1
package test;

import java.util.HashSet;

public class Test{
	
	private static class Point{
		int x;
		int y;
		public Point(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
		
		@Override
		public boolean equals(Object obj) {
			Point o = (Point) obj;
			if(x==o.x && y==o.y)
				return true;
			else 
				return false;
		}
		
		@Override
		public String toString() {			
			return x+","+y;
		}
		
		@Override
		public int hashCode() {
			return 10000*x+y;
		}
	}
	
	static HashSet<Point> points = new HashSet<Point>();
	
	public static void main(String[] args) {
		//测试数据
		points.add(new Point(-2, 5));
		points.add(new Point(6, 5));
		points.add(new Point(2, 3));
		points.add(new Point(0, 0));
		points.add(new Point(4, 0));
						
		int sum = 0;
		for(Point point : points){
			sum += point.x;
		}
		sum = sum/points.size();//这个就是对称轴
		
		//检查每个点是否存在对称点
		for(Point point : points){
			if(!points.contains(new Point(sum*2-point.x, point.y))){
				System.out.println("不对称");
				System.exit(0);				
			}
		}
		System.out.println("对称");
	}          
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值