题目描述
输入N个互不相同的二维整数坐标,求这N个坐标可以构成的正方形数量。
输入描述
第一行输入一个正整数N,代表坐标的数量。
之后输入坐标x,y(x,y都为整数),共N行。
输出描述
输出由这N个坐标可以构成的正方形数量。
纸上分析与建模过程
做算法题不能直接上代码,代码只是模型的一种"语言描述"而已。必须将问题和解决方案完全分析清楚之后再“下笔”,建立真实世界的数学模型或者计算机模型,搞清楚事物的本质“是什么”,这才是解决问题最重要的一步。
一、预处理
#include<stdio.h>
#include<stdbool.h>
int main(){
int n;
scanf("%d",&n);//输入坐标的个数
//coordinates[]为二维数组,N个坐标
int coordinates[n][2];
for(int i=0;i<n;i++){
scanf("%d %d",&coordinates[i][0],&coordinates[i][1]);
}//输入横坐标和纵坐标
//正方形个数
int squareCount=0;
for(int i=0;i<n;i++){//外层循环遍历每一个点
//点A(x1,y1)
int x1=coordinates[i][0];
int y1=coordinates[i][1
for(int j=i+1;j<n;j++){
//点B(x2,y2)
int x2=coordinates[j][0];
int y2=coordinates[j][1];
//点C(x3,y3)
int x3=x1-(y1-y2);
int y3=y1+(x1-x2);
bool has3=false;
//点D(x4,y4)
int x4=x2-(y1-y2);
int y4=y2+(x1-x2);
bool has4=false;
//点E(x5,y5)
int x5=x1+(y1-y2);
int y5=y1-(x1-x2);
bool has5=false;
//点F(x6,y6)
int x6=x2+(y1-y2);
int y6=y2-(x1-x2);
bool has6=false;
//解决:...
}
}
}
二、解决问题
//解决:遍历所有点,匹配能构成正方形的
for(int k=0;k<n;k++){
if(x3==coordinates[k][0]&&y3==coordinates[k][1]){
has3=true;//input中,C点存在
}
if(x4==coordinates[k][0]&&y4==coordinates[k][1]){
has4=true;//input中,D点存在
}
if(x5==coordinates[k][0]&&y5==coordinates[k][1]){
has5=true;//input中,E点存在
}
if(x6==coordinates[k][0]&&y6==coordinates[k][1]){
has6=true;//input中,F点存在
}
}
//边CD存在
if(has3&&has4){
squareCount++;
}
//边EF存在
if(has5&&has6){
squareCount++;
}
}
}
printf("一共可以构成%d个正方形\n",squareCount/4);
三、完整代码
#include<stdio.h>
#include<stdbool.h>
int main(){
int n;
scanf("%d",&n);//输入坐标的个数
//coordinates[]为二维数组,N个坐标
int coordinates[n][2];
for(int i=0;i<n;i++){
scanf("%d %d",&coordinates[i][0],&coordinates[i][1]);
}//输入横坐标和纵坐标
//正方形个数
int squareCount=0;
for(int i=0;i<n;i++){//外层循环遍历每一个点
//点A(x1,y1)
int x1=coordinates[i][0];
int y1=coordinates[i][1
for(int j=i+1;j<n;j++){
//点B(x2,y2)
int x2=coordinates[j][0];
int y2=coordinates[j][1];
//点C(x3,y3)
int x3=x1-(y1-y2);
int y3=y1+(x1-x2);
bool has3=false;
//点D(x4,y4)
int x4=x2-(y1-y2);
int y4=y2+(x1-x2);
bool has4=false;
//点E(x5,y5)
int x5=x1+(y1-y2);
int y5=y1-(x1-x2);
bool has5=false;
//点F(x6,y6)
int x6=x2+(y1-y2);
int y6=y2-(x1-x2);
bool has6=false;
//解决:遍历所有点,匹配能构成正方形的
for(int k=0;k<n;k++){
if(x3==coordinates[k][0]&&y3==coordinates[k][1]){
has3=true;//input中,C点存在
}
if(x4==coordinates[k][0]&&y4==coordinates[k][1]){
has4=true;//input中,D点存在
}
if(x5==coordinates[k][0]&&y5==coordinates[k][1]){
has5=true;//input中,E点存在
}
if(x6==coordinates[k][0]&&y6==coordinates[k][1]){
has6=true;//input中,F点存在
}
}
//边CD存在
if(has3&&has4){
squareCount++;
}
//边EF存在
if(has5&&has6){
squareCount++;
}
}
}
printf("一共可以构成%d个正方形\n",squareCount/4);
return 0;
}