我有4分,我必须检查它的方形及其与x轴和y轴的关系。
这是我的代码:
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int wasIn(int x, int n[2])
{
for (int i=0; i<2; i++)
if (x==n[i]) return i;
return -1;
}
int main(int argc, char *argv[])
{
int x[4];
int y[4];
for (int i=0; i<4; i++)
cin>>x[i]>>y[i];
int was[2];
was[0]=-1001;
was[1]=-1001;
int countwas[2];
countwas[0]=0;
countwas[1]=0;
short old=0;
bool ok=true;
int tmp;
for (int i=0; i<4; i++)
{
if ((tmp=wasIn(x[i],was))==-1) {was[old]=x[i]; old++;} else countwas[tmp]++;
if ((tmp=wasIn(y[i],was))==-1) {was[old]=y[i]; old++;} else countwas[tmp]++;
if (old>2) { ok=false; break; }
}
if (ok && countwas[1]!=3 || countwas[0]!=3) ok=false;
//cout<<"C1: "<<countwas[0]<<endl; //debug
//cout<<"C2: "<<countwas[1]<<endl;
if (ok) cout<<"YES"; else cout<<"NO";
//system("PAUSE");
return EXIT_SUCCESS;
}
工作原理: 只检查是否只有2个不同的数字,并且有4个(由第1个点解决,所以在程序中3个)相同的出现。
Thanx任何回复。 它有时会崩溃并输出错误的信息......也许索引超出范围?
答案 0 :(得分:4)
我不会修复您的代码,但算法非常简单:
检查顶点是否与顶部点在同一水平线上,与底部左侧点在同一垂直线上。
检查底部点是否与底部左下角位于同一水平线上,与垂直点位于同一垂直线上。
如果两者都是真的,那么你正在处理一个抵押矩形。
现在,如果你需要知道它是否是正方形,你需要再添加一个支票,水平面是否与垂直边一样大。
答案 1 :(得分:0)
终于做到了。我用了另一个想法。我取两个不同的值x或y,根据这2个数字生成正确的平方并与给定的数字进行比较。如果有人需要代码:
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int isIn(int x, int n[2])
{
for (int i=0; i<2; i++)
if (x==n[i]) return i;
return -1;
}
int cmpPoint(int x, int y, int xt[4], int yt[4])
{
for (int i=0; i<4; i++)
if (x==xt[i] && y==yt[i]) return i;
return -1;
}
int main(int argc, char *argv[])
{
int x[4];
int y[4];
for (int i=0; i<4; i++)
cin>>x[i]>>y[i];
int dif[2]={-1001,-1001};
short act=-1;
short tmp;
for (int i=0; i<4; i++)
{
if ((tmp=isIn(x[i],dif))==-1) {act++; dif[act]=x[i];}
if (act>1) break;
if ((tmp=isIn(y[i],dif))==-1) {act++; dif[act]=y[i];}
if (act>1) break;
}
if (act!=1)
{
cout<<"NO";
return 0;
}
int x2[4];
int y2[4];
bool was[4]={0,0,0,0};
x2[0]=dif[0];
y2[0]=dif[0];
x2[1]=dif[1];
y2[1]=dif[0];
x2[2]=dif[0];
y2[2]=dif[1];
x2[3]=dif[1];
y2[3]=dif[1];
bool ok=true;
for (int i=0; i<4; i++)
{
tmp=cmpPoint(x[i],y[i],x2,y2);
if (was[tmp]) {ok=false; break;}
else was[tmp]=true;
}
if (ok) cout<<"YES"; else cout<<"NO";
//system("PAUSE");
return EXIT_SUCCESS;
}