zoukankan      html  css  js  c++  java
  • Hdu 5365 Run

    关于这题,先看看官方的解释:地球人都知道整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可。假如你不是地球人,那么即使暴力枚举正三边  形和稍微不那么暴力地找正五边形和正六边形也是可以通过的(反正找不到)。

    那么很明显,接下来要思考就是如何找正四边形,只找四条相连且相等的边是不够的,因为四边相连且相等的可能是菱形,不是正四边形。

    我的思路参考了比赛中Hezhu提交的代码:

      1.寻找四条边的每条边要么平行x轴,要么平行y轴的正四边形。以一个点为基准点(x, y),算做是正四边型中的一个点,然后枚举长度r,寻找是否存在(x+r, y)(x, y+r)(x+r, y+r).

      2.寻找每条边并不平行x轴或y轴的正四边形,也是找基准点,枚举长度,我把自己画的图放上来了:

        

        以(i, j)为基准点,枚举长度,k,r依旧是寻找能构成正四边形的四个点是否存在。

    一点感悟:比赛时,其实有质疑整点是否能形成正三边形,正五边形,正六边形,但是一时间无法证明整点不能构成这三种正边形,于是就思考如何暴力求解,正三、四、五、六边形。比赛后,才发现,自己的质疑其实是有道理的,只是当时选择了保守方案。话说,比赛的时候,一直在想用递归求解,但在知道只有四边形后,不知道为什么却还在思考如何用递归求解,直至看了别人的代码,才发现自己有点舍近求远了。

    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     * Created by emerald on 8/11/15.
     * hdu 5365
     */
    public class Main {
        public static void main(String []args) {
            Scanner in = new Scanner(System.in);
            boolean vis[][] = new boolean[15][15];
            int N;
            while(in.hasNext()) {
                N = in.nextInt();
                for(int i=0; i<15; ++i) {
                    for(int j=0; j<15; ++j) {
                        vis[i][j] = false;
                    }
                }
                int x, y;
                for(int i=0; i<N; ++i) {
                    x = in.nextInt();
                    y = in.nextInt();
                    vis[x][y] = true;
                }
    
                int ans = 0;
                // 1
                for(int i=0; i<9; ++i) {
                    for(int j=0; j<9; ++j) {
                        for(int r=1; r+i<9 && r+j<9; ++r) {
                            if(vis[i][j] && vis[i+r][j] && vis[i][j+r] && vis[i+r][j+r]) {
                                ++ ans;
                            }
                        }
                    }
                }
    
                // 2
                for(int i=0; i<9; ++i) {
                    for(int j=0; j<9; ++j) {
                        for(int r=1; r<9; ++r) {
                            for(int k=1; j+k+r<9 && i+r+k<9; ++ k) {
                                if(vis[i][j+k] && vis[i+r][j] && vis[i+k][j+k+r] && vis[i+r+k][j+r]) {
                                    ++ ans;
                                }
                            }
                        }
                    }
                }
                System.out.println(ans);
            }
        }
    }
    
  • 相关阅读:
    Mongodb---记一次事故故障
    扎克伯格的中文夜:想要成功就不能放弃
    TTS-零基础入门之停止列表中单条语音播报
    卡尔曼滤波(Kalman Filter) 的进一步讨论
    2014.8.12-AKKA和Actor model 分布式开发环境学习小结
    c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用
    Spring源代码解析和配置文件载入
    java调用c++ dll出现中文乱码
    Android任务栈TaskStack
    应用中清理缓存应用实现
  • 原文地址:https://www.cnblogs.com/Emerald/p/4720631.html
Copyright © 2011-2022 走看看