日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

poj2002 hash+数学

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj2002 hash+数学 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 .求不同的四個點組成最大正方形的總個數;

2.由(x1,y1),(x2,y2),可以求出另外兩點的坐標;

即 x3=x1+(y1-y2);y3=y1-(x1-x2);

??? x4=x2+(y1-y2);y4=y2-(x1-x2);

或者

? x3=x1-(y1-y2);y3=y1+(x1-x2);

x4=x2-(y1-y2);y4=y2+(x1-x2);

3.由求出的點的坐標可以hash查找是否存在,如果存在就加一;

4.最終答案為8倍的正方形個數;

5.源碼;

#include<iostream>
#include<stdio.h>
using namespace std;
const int prime=99991;
struct Node
{
??? int x;
??? Node *next;
};
Node hash[100000];
int a[20000],b[20000];
int n;
void insert(int key,int i)
{
??? if(hash[key].x==0)
??? {
??????? hash[key].x=i;
??? }
??? else{
??????? Node *p=&hash[key],*pp;
??????? while (p!=NULL)
??????? {
??????????? pp=p;
??????????? p=p->next;
??????? }
??????? Node *p1 = new Node;
??????? p1->x=i;
??????? p1->next=NULL;
??????? pp->next=p1;
??? }
}
void init()
{
??? int i,j;
??? for (i=0;i<=99991;i++) {hash[i].x=0;hash[i].next=NULL;}
??? for (i=1;i<=n;i++)
??? {
??????? scanf("%d%d",&a[i],&b[i]);
??????? int key=(a[i]*a[i]+b[i]*b[i])%prime;
??????? insert(key,i);
??? }
}
int ans;
bool find(int key,int x,int y)
{
??? Node *p=&hash[key];
??? while (p!=NULL)
??? {
??????? if(a[p->x]==x&&b[p->x]==y) return true;
??????? p=p->next;
??? }
??? return false;
}
void make()
{
??? ans=0;
??? int key1,key2,x1,x2,y1,y2;
??? int i,j;
??? for (i=1;i<=n;i++)
??????? for (j=1;j<=n;j++)
???? if(i!=j)????????? {
????????????? x1=a[i]+b[i]-b[j];y1=b[i]-(a[i]-a[j]);
????????????? x2=a[j]+b[i]-b[j];y2=b[j]-(a[i]-a[j]);
????????????? key1=(x1*x1+y1*y1)%prime;
????????????? key2=(x2*x2+y2*y2)%prime;
????????????? if(find(key1,x1,y1)&&find(key2,x2,y2)) ans++;//cout<<x1<<"? "<<y1<<endl;cout<<x2<<" "<<y2<<endl;}
????????????? x1=a[i]-(b[i]-b[j]);y1=b[i]+(a[i]-a[j]);
????????????? x2=a[j]-(b[i]-b[j]);y2=b[j]+(a[i]-a[j]);
?????????????? key1=(x1*x1+y1*y1)%prime;
????????????? key2=(x2*x2+y2*y2)%prime;
????????????? if(find(key1,x1,y1)&&find(key2,x2,y2)) ans++;
????????? }
??? printf("%d\n",ans/8);
}
int main()
{
??? while(scanf("%d",&n))
??? {
??????? if(n==0) break;
??????? init();
??????? make();
??? }
??? return 0;
}

轉載于:https://www.cnblogs.com/dlut-li/p/5356303.html

總結

以上是生活随笔為你收集整理的poj2002 hash+数学的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。