2012-03-07 4 views
-2

私は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つの異なる数字だけがあるかどうかをチェックし、exacly 4(第一の点でdecrased、そのプログラムでその3)同じ出現箇所があります。

任意の応答のためのThanx。 時々クラッシュし、間違った出力を出します...インデックスが範囲外になっていますか?

+0

どの時点でクラッシュしますか?あなたはデバッガで何が見えますか? – pmr

+0

まあ、私は知らない、そのシステムで私のチェックではない。私のテストでは大丈夫です。宿題タグを参照してください:)(btw、これを追加するには高価なものです) –

+0

@David Heffernan広場は申し訳ありません... –

答えて

4

私はあなたのコードを修正しませんが、このアルゴリズムは、本当に簡単です:

  • チェックTOPLEFTポイントがtopright点として、そして同じ垂直線上に同じ水平線上にある場合ボトムレフトポイント。

  • 下の点が下の左の点と同じ水平線にあり、上の点と同じ垂直線にあるかどうかを確認してください。

両方が真である場合は、付随する矩形を扱っています。

正方形かどうかを知る必要がある場合は、横の辺が縦の辺と同じかどうかをもう一度確認する必要があります。

+0

しかし...私はどちらが優位であるかわかりません... –

+1

その相対的です。 xとyの中で最も小さい番号のポイントが左上にあり、xとyの数字が最も大きいものがあなたの最も高いポイントです。これは切り替えが可能なので相対的です。 –

0

最後にしました。私は別のアイデアを使った。私は2つの異なる値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; 
} 
関連する問題