C ++检查给定的点是否正方形

时间:2012-03-07 20:11:03

标签: c++

我有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任何回复。 它有时会崩溃并输出错误的信息......也许索引超出范围?

2 个答案:

答案 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;
}