为何保持编程的兴趣,还是找一些代码来写
看了 http://poj.org/problem?id=1106, 分析思路如下:
1)把坐标系原点定位为圆心,把其他点转化为极坐标
2)从第一个点开始,逐个查找满足所有落在下面区域内的点:此点到原点为起始边,半径为参数所给的半圆围成区域
3)所有点都扫描后给出最大覆盖的点数
package com.pnp.hello; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Arc2D; import javax.swing.JFrame; public class Hello { static class My extends JFrame { double circle_x = 250; double circle_y = 250; double circle_r = 35; double[][] in_points = new double[][]{ {250, 280}, {230, 270}, {270, 270}, {240, 230}, {260, 230}, {240, 290}, {260, 290} }; double[][] points = new double[in_points.length][2]; double angles[] = new double[points.length]; double dists[] = new double[points.length]; int max_count=0; // max point count int begin_index=-1; // the begin point of half circle int draw_index=0; // for drawing animation void cal () { // trans coordinate to polar coordinate for ( int i=0; i < points.length; i++ ) { points[i][0] = in_points[i][0] - circle_x; points[i][1] = in_points[i][1] - circle_y; angles[i] = Math.atan2(points[i][1], points[i][0]); dists[i] = Math.sqrt( points[i][0] * points[i][0] + points[i][1] * points[i][1] ); } // count for ( int i=0; i < points.length; i++ ) { int count =0; for ( int j=0; j < points.length; j++) { double begin_a = angles[i]; double end_a = begin_a + Math.PI; if ( angles[j] >= begin_a && angles[j] <= end_a && dists[j] < circle_r) count++; } if ( count > max_count ) { max_count = count; begin_index = i; } // for animations effect draw_index = i; this.repaint(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } this.repaint(); draw_index = begin_index; System.out.printf("max_count: " + max_count + " begin_index: " + begin_index); } public void paint(Graphics g) { g.clearRect(0, 0, 500, 500); double ag = angles[draw_index]; Arc2D arc = new Arc2D.Double(circle_x-circle_r, circle_y-circle_r, circle_r*2, circle_r*2, ag/Math.PI * 180, 180 , Arc2D.PIE); Graphics2D g2d = (Graphics2D) g; g2d.fill(arc); g.setColor(Color.RED); for ( int i=0; i < in_points.length; i++ ) { g.drawLine((int)in_points[i][0],(int)in_points[i][1] ,(int)in_points[i][0] + 1 , (int)in_points[i][1] +1 ); //g.drawLine((int)circle_x-circle_r,(int)circle_y,(int)circle_x + circle_r , (int)circle_y ); } } } public static void main(String[] args) { My frame = new Hello.My(); frame.setTitle("half circle cover points"); frame.setBounds(0, 0, 500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.cal(); } }
时间: 2024-10-12 18:42:01