糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 3668 Game of Lines 哈希

题目大意:
给出n个点,问你最多能连多少条线,保证这些线都不平行

思路:
计算每两点斜率,用分数的形式表示,然后哈希判重。要考虑斜率不存在和斜率为0的情况

#include <stdio.h>

int hash[2][2024][2064/32], hori, vert;
struct node {
    
int x, y;
}
 points[256];
int N, line_cnt;

__inline 
int gcd(int a, int b)
{
    
int r;

    
if (a < b) {
        r 
= a;
        a 
= b;
        b 
= r;
    }


    
while (1{
        r 
= a % b;
        
if (!r)
            
return b;
        a 
= b;
        b 
= r;
    }

}


__inline 
int test_bit(int *arr, int idx)
{
    
return arr[idx >> 5& (1 << (idx & 0x1f));
}


__inline 
int set_bit(int *arr, int idx)
{
    
return arr[idx >> 5|= (1 << (idx & 0x1f));
}


__inline 
int abs(int i)
{
    
return i < 0 ? -i : i;
}


__inline 
void gril(struct node *pa, struct node *pb)
{
    
int dx, dy, neg, r;

    dx 
= pa->- pb->x;
    dy 
= pa->- pb->y;
    
if (!dx) {
        
if (vert)
            
return ;
        vert 
= 1;
        line_cnt
++;
        
return ;
    }

    
if (!dy) {
        
if (hori)
            
return ;
        hori 
= 1;
        line_cnt
++;
        
return ;
    }

    neg 
= dx*dy < 0;
    dx 
= abs(dx);
    dy 
= abs(dy);
    r 
= gcd(dx, dy);
    dx 
/= r;
    dy 
/= r;
    
if (test_bit(hash[neg][dx], dy))
        
return ;

    set_bit(hash[neg][dx], dy);
    line_cnt
++;
}


int main()
{
    
int i, j;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d"&N);
    
for (i = 0; i < N; i++
        scanf(
"%d%d"&points[i].x, &points[i].y);

    
for (i = 0; i < N - 1; i++{
        
for (j = i + 1; j < N; j++{
            gril(
&points[i], &points[j]);
        }

    }

    printf(
"%d\n", line_cnt);

    
return 0;
}

posted on 2010-02-14 22:29 糯米 阅读(430) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理