c语言正方形个数问题

给定坐标。。。计算一共有多少个正方形? 例如:(0,0)(0,1)(1,0)(1,1),有一个正方形。。。。求 解题思路啊。。。。。。。。。。。。>-<~~~ 关键是 思路思路 ~~~ 来人 ~
★实验任务

在一个二维平面上给定N个点( 4 <= N <= 1000)Pi(xi,yi) ( |xi| <= 20000 ,|yi| <= 20000,不存在重复点),请问在这些点中能形成多少个正方形。

★数据输入

每个样例第一行输入一个整数N( 4 <= N <= 1000),接下来有N行每行输入两个整数xi,yi代表点的坐标。

★数据输出

输出一行:的正方形的个数

输入示例

4

1 0

0 1

1 1

0 0

输出示例

1

输入示例

9

0 0

1 0

2 0

0 2

1 2

2 2

0 1

1 1

2 1

输出示例

6

http://zhidao.baidu.com/question/72851978.html
真的是很复杂的题。希望我没有说错。
其实当n>=4时,还存在一些位置比较偏的正方形。
比如n=4时,(1,2)(2,4)(3,1)(4,3)四个点也是一个正方形。同时还有一个和它对称着的正方形。一条边斜着占1*2的空间。
n>4时,情况会更加复杂。

假设a*b是一条边占的空间为a个长b个宽。n=3时的正的正方形记为1*0和2*0,菱形记为1*1。n>3时,a*b和b*a表示形状对称的一些偏的正方形。
那么,正方形的种类:
第一组:1*0,2*0,…,(n-1)*0.
二:1*1,1*2,1*3,...,1*(n-2).
三:2*1,2*2,2*3,...,2*(n-3).
……
第n-2组:(n-3)*1,(n-3)*2.
第n-1组:(n-2)*1.
其中,a*b组中,存在的正方形个数为(n-a-b)^2.
总的正方形为:
1^2+2^2+3^2+...+(n-1)^2 ...1
+ 1^2+2^2+3^2+...+(n-2)^2 ...2
+ 1^2+2^2+3^2+...+(n-3)^2 ...3
+ ...
+ 1^2 ...n-1
= (n-1)*1^2+(n-2)*2^2+(n-3)*3^2+...+1*(n-1)^2
n-1
= E (n-k)k^2. (求和符号暂且这样打了)
k=1
【应该说种类是a*b的那一种正方形比较好。一个正方形的一条边如果占据了a*b的空间的话,那么这个正方形从最左边到最右边或者从最上边到最下边的距离就是a+b,用了a+b+1个点。而一个n*n的点阵上 上下和 左右只能包含(n-(a+b+1)+1)=n-a-b个,a*b的这种正方形就有(n-a-b)^2个。
比如n=3时,a=b=1,就是中间的菱形的个数为(3-1-1)^2=1个。小正方形是a*0型,有(3-1-0)^2=4个,大正方形2*0型,有(3-2-0)^2=1个。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-01
先排序,然后枚举任意两个点,在二分查找是否存在两个对称点
*/
#include<iostream>
#include<algorithm>
using namespace std;

struct point{
int x,y;
};
point p[1001];
int n;

int cmp(point a,point b)
{
if( a.x!=b.x )
return a.x<b.x;
else return a.y<b.y;
}

bool search(int x,int y)
{
int l=0,r=n-1;
while( l<=r )
{
int mid=(l+r)/2;
if( p[mid].x==x && p[mid].y==y ) return true;
if( p[mid].x!=x )
{
if( p[mid].x>x ) r=mid-1;
else l=mid+1;
} else {
if( p[mid].y>y ) r=mid-1;
else l=mid+1;
}
}
return false;
}

int main()
{
int i,j;
// freopen("t.txt","r",stdin);
int t;
cin>>t;
while( t-- )
{
while( cin>>n && n )
{
for(i=0;i<n;++i)
cin>>p[i].x>>p[i].y;
sort(p,p+n,cmp);
int cns=0;
for(i=0;i<n;++i)
{
for(j=i+1;j<n;++j)
{
/*
三角形全等,分别求出对应的x,y的坐标
*/
int x1=p[i].x+p[j].y-p[i].y;
int y1=p[i].y+p[i].x-p[j].x;
if( !search(x1,y1) ) continue;
int x2=p[j].x+p[j].y-p[i].y;
int y2=p[j].y+p[i].x-p[j].x;
if( !search(x2,y2) ) continue;
cns++;
}
}
cout<<cns/2<<endl;
}
if( t ) cout<<endl;
}
return 0;
}
第2个回答  2011-12-01
定义二维数组,a[n][m],然后用两次循环语句,for(i=0;i<=n;i++)for(j=0;j<=m;j++);
希望给出原题~~追问

原题 给了 ~~~

追答

int n,m,a;
int x[],y[];
scanf("请输入不小于4个的坐标数:%d\n",&n);
for(i=0;i<n;i++);
{
scanf("请输入坐标(%d %d)",x[i]y[i]);
}
让我下午想一想啊!!

第3个回答  2011-12-06
我是算法数据结构的老师,你应该知道我是谁吧。我刚把你的QQ拿给朱导了。如果你现在马上向辅导员认错。我就当作没看到。 这道题还是很简单的,关键是用已知2点的坐标推出另外2点的坐标的公式。希望你好好学习算法数据结构!

c语言正方形个数问题
k=1 【应该说种类是a*b的那一种正方形比较好。一个正方形的一条边如果占据了a*b的空间的话,那么这个正方形从最左边到最右边或者从最上边到最下边的距离就是a+b,用了a+b+1个点。而一个n*n的点阵上 上下和 左右只能包含(n-(a+b+1)+1)=n-a-b个,a*b的这种正方形就有(n-a-...

C语言编程编程给定整数n输出由字符*组成的空心正方形
思路:输出正方形即输出正方形的外围就行,外围有个特点就是行列下标必有0或者是正方形的大小减一,输入一个n表示正方形大小,输出一个由*组成的正方形。includestdio.hvoidmain(){intn,i;scanf(%d,&n);\/*输入个数n*\/for(i=1;i=n;i++)printf(*);\/*循环输出字符*,若想修改显示格式...

C语言的打空心正方形问题..
main(){ int a,i,j;printf("输入正方形的边长1-20:");scanf("%d",&a);for( i=0;i<a;i++)printf("*");printf("\\n");for(i=0;i<a-2;i++){ printf("*");for(j=0;j<a-2;j++)printf(" ");printf("*");printf("\\n");} for(i=0;i...

C语言问题!!!
include <deque> include <cmath> include <iomanip> using namespace std;\/\/ 打印函数 template<class T> void print(valarray<T>& t);\/\/ 判定函数 template<class T> bool judge(valarray<T>& data);int main(){ \/\/ 这里表示数字从1~9的魔方,一般写1,4,9,16...才能构成正方形 con...

C语言编8个程序 比如输入正方形边长求其面积和周长 正方体求体积_百度...
\/\/ 第一个:求数字位数#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define CRT_SECURE_NO_DEPERCATE int main(void) { int data; printf("Enter a number:"); scanf("%d",&data); if (data>=10000) {printf("Input Error\\n");syst...

c语言编程提问
include <stdio.h>int main(){ int n,i,j; char c1,c2; printf("要生成的正方形的大小和符号c1 c2,用空格隔开"); scanf("%d %c %c",&n,&c1,&c2); printf("输出的正方形为:\\n"); for(i=0;i<n;i++) { if(i==0||i==(n-1)){ for(j=0...

c语言一个判断正方形的问题 请大神在判断函数里面帮我写一下
在你程序基础上修改的 include <stdio.h>#include <stdlib.h>typedef struct coordinate{int x;int y;}coordinate;typedef struct{coordinate a;coordinate b;coordinate c;coordinate d;}quadrangle;quadrangle* LoadData(char *filename, int *num){FILE *fp;int i;quadrangle *testdata;if ((fp=...

c语言问题,答案是25个点组成的正方形图案,那个过程看不懂,求解释为什么...
void main(){ int i,j,k;\/\/外循环4次,首先要打印的是上半部分三角形 for(i=0;i<=3;i++){ \/ 这里是为了打印每行开头预留的空格,显然随着行号i增大,j能循环次数越小,那么行的开头能打印的空格就越少,于是出现了塔式结构,即正三角 \/ for(j=0;j<=2-i;j++){ printf(" ");\/\/...

C语言 输出正方形,不知道哪错了,求解
scanf里面如果想读进一个数字应该用%d 你的while里面没有输出一个回车,怎么可能是正方形呢 你就是输出了n*n个星号,你需要在while的外面printf("\\n")打印一个回车

用c语言编程,输入四个数,判断这四个数据能否组成四边形和正方形,能了...
偌a>0和(且)a=12,则错。 这语句的意思是a=12,则错。a>0是多余的。回到你的问题,意思就是判断这四个数据能否组成正方形。程序如下:include<stdio.h> int main(){ float a,b,c,d;int m1,m2,m3;printf("请输入abcd四个数据:\\n");scanf("%f%f%f",&a,&b,&c,&d);m1=(a-...

相似回答