实现100%通过率](http://pic.xiahunao.cn/yaotu/华为OD机试2025C卷-构成正方形的数量[100分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率)
个人主页深夜coding算法 专栏系列2026年华为最新OD机试题库详解 一次订阅永久解锁 | 持续更新100篇 | 6语言全覆盖文章目录❄️前言☀️一题目描述 题目名称 题目内容 输入描述 输出描述 示例☀️二解题思路☀️三代码实现CJavaPython3C语言JavaScriptGo☀️四复杂度分析⭐ 五易错点坑1整点判断坑2去重共勉❄️前言给N个点问能组成多少个正方形。纯几何题OD机试偶尔来一道。思路枚举对角线用中点向量旋转求另外两个点。☀️一题目描述 题目名称构成正方形的数量 题目内容给定平面上 N 个互不相同的整数坐标点(xi, yi)。从中选出 4 个点判断能否构成一个正方形四边相等且对角线相等。请计算一共可以组成多少个不同的正方形。 输入描述第一行整数 N接下来 N 行每行两个整数 x y 输出描述输出正方形的个数 示例输入 6 0 0 1 0 0 1 1 1 2 0 2 1 输出 2☀️二解题思路枚举所有点对(p1, p2)作为正方形的一条对角线中点mx (x1x2)/2, my (y1y2)/2向量vx x1-mx, vy y1-my旋转90°得另外两点p3 (mx-vy, myvx), p4 (mxvy, my-vx)用 HashSet 查这两点是否存在☀️三代码实现C#includeiostream#includeunordered_setusingnamespacestd;structHash{size_toperator()(constpairint,intp)const{return(size_t)p.first*1000007p.second;}};intmain(){intN;cinN;unordered_setpairint,int,Hashpts;for(inti0;iN;i){intx,y;cinxy;pts.insert({x,y});}intans0;for(autoa:pts)for(autob:pts){if(ab)continue;intmxa.firstb.first,mya.secondb.second;intvxa.first*2-mx,vya.second*2-my;intx3(mx-vy)/2,y3(myvx)/2;intx4(mxvy)/2,y4(my-vx)/2;if(pts.count({x3,y3})pts.count({x4,y4})(mx1)0(my1)0)ans;}coutans/4endl;// 每条对角线被数了4次}Javaimportjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intNsc.nextInt();SetStringsetnewHashSet();Listint[]ptsnewArrayList();for(inti0;iN;i){intxsc.nextInt(),ysc.nextInt();set.add(x,y);pts.add(newint[]{x,y});}intans0;for(int[]a:pts)for(int[]b:pts){if(ab)continue;intmxa[0]b[0],mya[1]b[1];intvxa[0]*2-mx,vya[1]*2-my;intx3(mx-vy)/2,y3(myvx)/2;intx4(mxvy)/2,y4(my-vx)/2;if(set.contains(x3,y3)set.contains(x4,y4)(mx1)0(my1)0)ans;}System.out.println(ans/4);}}Python3Nint(input())ptsset()for_inrange(N):pts.add(tuple(map(int,input().split())))ans0forx1,y1inpts:forx2,y2inpts:if(x1,y1)(x2,y2):continuemx,myx1x2,y1y2 vx,vyx1*2-mx,y1*2-myifmx%2ormy%2:continuex3,y3(mx-vy)//2,(myvx)//2x4,y4(mxvy)//2,(my-vx)//2if(x3,y3)inptsand(x4,y4)inpts:ans1print(ans//4)C语言#includestdio.h#defineMAX_N100typedefstruct{intx,y;}Pt;intmain(){intN;Pt pts[MAX_N];scanf(%d,N);for(inti0;iN;i)scanf(%d %d,pts[i].x,pts[i].y);intans0;for(inti0;iN;i)for(intj0;jN;j){if(ij)continue;intmxpts[i].xpts[j].x,mypts[i].ypts[j].y;intvxpts[i].x*2-mx,vypts[i].y*2-my;if(mx1||my1)continue;intx3(mx-vy)/2,y3(myvx)/2,x4(mxvy)/2,y4(my-vx)/2;intok30,ok40;for(intk0;kN;k){if(pts[k].xx3pts[k].yy3)ok31;if(pts[k].xx4pts[k].yy4)ok41;}if(ok3ok4)ans;}printf(%d\n,ans/4);}JavaScriptconstinputrequire(fs).readFileSync(0,utf-8).trim().split(\n);constNinput[0];constptsnewSet();for(leti1;iN;i)pts.add(input[i]);letans0;constarr[...pts].map(ss.split( ).map(Number));for(const[x1,y1]ofarr)for(const[x2,y2]ofarr){if(x1x2y1y2)continue;constmxx1x2,myy1y2,vxx1*2-mx,vyy1*2-my;if(mx%2||my%2)continue;constx3(mx-vy)/2,y3(myvx)/2,x4(mxvy)/2,y4(my-vx)/2;if(pts.has(${x3}${y3})pts.has(${x4}${y4}))ans;}console.log(ans/4|0);GopackagemainimportfmttypePtstruct{x,yint}funcmain(){varNint;fmt.Scan(N)set:map[Pt]bool{}pts:make([]Pt,N)fori:0;iN;i{fmt.Scan(pts[i].x,pts[i].y)set[pts[i]]true}ans:0for_,a:rangepts{for_,b:rangepts{ifab{continue}mx,my:a.xb.x,a.yb.y vx,vy:a.x*2-mx,a.y*2-myifmx1!0||my1!0{continue}x3,y3:(mx-vy)/2,(myvx)/2x4,y4:(mxvy)/2,(my-vx)/2ifset[Pt{x3,y3}]set[Pt{x4,y4}]{ans}}}fmt.Println(ans/4)}☀️四复杂度分析指标数值时间复杂度O(N²)空间复杂度O(N)⭐ 五易错点坑1整点判断对角线中点坐标必须是整数mx%20 my%20否则旋转后的坐标不是整数。坑2去重每条对角线被枚举4次AB、BA 旋转方向输出要除以4。共勉几何题不要怕向量旋转公式记住就行。OD机试考几何就是一个套路枚举公式哈希查表。关于本专栏一次订阅永久解锁全部100篇真题详解6语言全覆盖Java | Python3 | C | C语言 | JsNode | Go