2012-03-07 2 views
-2

4 점을 받았습니다. x 축과 y 축에 사각형이 있는지 확인해야합니다.주어진 점이 정사각형으로되어 있는지 C++로 확인하십시오.

#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 (1 점 decrased의 3 프로그램 때문에) 같은 회 발생하는 경우 확인 .

답장에 대한 고맙습니다. 때때로 충돌이 발생하고 잘못된 출력을줍니다 ... 범위를 벗어난 색인을 생성 할 수 있습니까?

+0

언제 충돌합니까? 디버거에서 무엇을 볼 수 있습니까? – pmr

+0

글쎄, 나도 몰라, 그 시스템에 의해 확인되지 않습니다. 내 테스트에서는 괜찮아. 숙제 태그보기 :) (btw, 이것을 추가하는 고맙습니다) –

+0

@David Heffernan 광장은 유감스럽게 생각합니다. –

답변

4

난 당신의 코드를 수정하지 않지만 알고리즘은 정말 간단하다 :

좌상 포인트는 topright 포인트와 같은 수평선에, 그리고
  • 확인하면 같은 수직선 하단 점.

  • 하단 오른쪽 점이 하단 왼쪽 점과 같은 수평선에 있고 위쪽 수직 점과 동일한 수직선에 있는지 확인하십시오.

두 가지 모두 true이면 부수적 인 사각형을 처리합니다.

이제 정사각형인지 알아야 할 경우 수평면이 수직면만큼 큰 지 여부를 한 번 더 확인해야합니다.

+0

하지만 ... 나는 어느 쪽이 낫고 똑바로인지 모르겠다. –

+1

그것의 친척. x와 y에서 가장 낮은 수의 점은 왼쪽 상단이고 x와 y에서 가장 큰 수는 가장 큰 점입니다. 이것은 교환이 가능하기 때문에 상대적입니다. –

0

마지막으로 수행했습니다. 나는 또 다른 아이디어를 사용했다. 나는 두 개의 다른 값인 x 또는 y를 취하여 그 두 개의 숫자를 기반으로 올바른 사각형을 생성하고 주어진 것과 비교했다. 누군가 필요하면 코드 :

#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; 
} 
관련 문제