Hash 三角形特徵 (資料結構作業)
阿新 • • 發佈:2018-12-01
演算法與資料結構實驗題 9.1
★實驗任務
給定 n 個三角形,用 a,b,c 表示三角形的三條邊(三角形可能有重複)。之後有 m 次詢問,每次詢問一個三角形在給定的 n 個三角形中出現的次數。
★資料輸入
第一行為 n,之後 n 行,每行有 a,b,c 三個數字表示三角形的三條邊;接下來一行為 m,之後有 m 行詢問,每行有 a,b,c 三個數字,表示要詢問的三角形的三邊。
資料保證 a,b,c 為正整數且可以構成一個三角形,且 a,b,c 不一定有序對於 40%的資料,n<=100,m<=100,a,b,c<=100
對於 70%的資料,n<=1000,m<=1000,a,b,c<=1000
對於 100%的資料,n<=5,000,m<=100,000,a,b,c<=999999
★資料輸出
對於每次詢問,輸出此三角形在之前給定的 n 個三角形中出現的次數
輸入示例 |
輸出示例 |
3 2 2 3 3 3 4 2 3 2 3 2 3 2 3 3 4 1 1 1 |
2 1 0 |
★提示
整數 Hash、字串 Hash
這道題有多種解法.
1.三角形三邊長作為hash物件,hash=a*1e6+b*1e6+c;
2. 直接pair<a,pair<b,c>> 利用pair巢狀,放入map進行hash.
3.對題目特殊處理化,三邊整數a,b,c.周長a+b+c;面積 :海倫公式;pair<int ,double> ,放入map ,hash。
3.
/* Date: 17/11/18 00:24 Description: 80 ms/5172 kb */ #include <cstdio> #include <map> #include <cmath> using namespace std; map <pair<int,double>,int > mp; int main() { double a,b,c,s; int n,m,sum; scanf ("%d",&n); pair <int,double> p; while (n--) { scanf ("%lf %lf %lf",&a,&b,&c); sum=a+b+c; s=sqrt(sum/2.0*1.0*(sum/2.0-a)*(sum/2.0-b)*(sum/2.0-c)); p.first=sum; p.second=s; mp[p]++; } scanf ("%d",&m); while (m--) { scanf ("%lf %lf %lf",&a,&b,&c); sum=a+b+c; s=sqrt(sum/2.0*1.0*(sum/2.0-a)*(sum/2.0-b)*(sum/2.0-c)); p.first=sum;p.second=s; printf ("%d\n",mp[p]); } return 0; }