2015-02-06 1 views
0

나는이 코드가 효율적이지 않다는 것을 알고 있습니다. 저는 C++을 처음 접했고 솔루션 프로그램에서 처음으로 시도했습니다 ...8 명의 퀸즈에 대한 대각선 테스트

문제는 프로그램을 실행하면 결과가 반환되지 않습니다. 디버깅을 시도하고 내 문제가 대각선 테스트에있는 것 같다 ...

내가 기울기 == 1 또는 기울기 == - 1을 설정할 때 깨달은 것은 480 결과지만 기울기를 설정할 때 == 1 || 기울기 == - 1 결과가 없습니다. 나는 논리적으로 무언가를 놓친 것 같은 기분이 든다. 그래서 문제는 내 기능 충돌의 마지막 부분에 있다고 생각합니다.

#include <iostream> 
#include <cmath> 
using namespace std; 
void print (bool a[8][8]){ 
for (int r=0; r<8; r++){ 
    for (int c=0; c<8; c++){ 
     if (a[r][c]==true) cout<<"X"; 
     else cout<<"E"; 
    } 
    cout<<endl; 
} 
} 


void XYdivide (bool a[][8], int xplace[], int yplace[]){ 
int uptonumber=0; 
for (int r=0; r<8; r++){ 
    for (int c=0; c<8; c++){ 
     if (a[c][r]) { yplace[uptonumber]=c; xplace[uptonumber]=r; uptonumber++;} 
    } 
} 
} 



bool clash (bool a[8][8]){ 
static int total=1; 
int Columncounter; 
for (int r=0; r<8; r++){ //tests columns 
    Columncounter=0; 
    for (int c=0; c<8; c++){ 
     if (a[r][c]) Columncounter++; 
     if (Columncounter>1) return false; 
    } 
} 
int Rowcounter; 
for (int c=0; c<8; c++){ //tests rows 
    Rowcounter=0; 
    for (int r=0; r<8; r++){ 
     if (a[r][c]) Rowcounter++; 
     if (Rowcounter>1) return false; 
    } 
} 
int xvalues [8]; int yvalues[8]; 
XYdivide(a , xvalues, yvalues); 
for (int i=0; i<8; i++){ //test diagonals 
    for (int j=0; j<8; j++){ 
     int slope=(yvalues[i]-yvalues[j])/(0.0+xvalues[i]-xvalues[j]); 
     if (slope==-1 || slope==1) return false; 
    } 
} 
print (a); cout<<endl<<total++<< endl; return true; 
} 


int main(){ 
bool a[8][8]={false}; 

cout<<"starting"<<endl; 

for (int r0=0; r0<8; r0++){ 
    a[0][r0]=true; 
    if (r0>0) a[0][r0-1]=false; 


    for (int r1=0; r1<8; r1++){ 
     a[1][r1]=true; 
     if (r1>0) a[1][r1-1]=false; 
     if (r1==0) a[1][7]=false; 


     for (int r2=0; r2<8; r2++){ 
      a[2][r2]=true; 
      if (r2>0) a[2][r2-1]=false; 
      if (r2==0) a[2][7]=false; 


      for (int r3=0; r3<8; r3++){ 
       a[3][r3]=true; 
       if (r3>0) a[3][r3-1]=false; 
       if (r3==0) a[3][7]=false; 


       for (int r4=0; r4<8; r4++){ 
        if (r4>0) a[4][r4-1]=false; 
        if (r4==0) a[4][7]=false; 
        a[4][r4]=true; 


        for (int r5=0; r5<8; r5++){ 
         a[5][r5]=true; 
         if (r5>0) a[5][r5-1]=false; 
         if (r5==0) a[5][7]=false; 


         for (int r6=0; r6<8; r6++){ 
          a[6][r6]=true; 
          if (r6>0) a[6][r6-1]=false; 
          if (r6==0) a[6][7]=false; 


          for (int r7=0; r7<8; r7++){ 
           a[7][r7]=true; 
           if (r7>0) a[7][r7-1]=false; 
           if (r7==0) a[7][7]=false; 
           clash(a); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
return 0; 


} 
+1

난 정말 당신이 8 레벨의 루프를 원하는 생각하지 않습니다. : s –

+0

완벽하게 작동하는 것 같습니다. 예, 제가 썼습니다 : 그것의 첫 번째 시도와 매우 비효율적 인! –

+0

보드 위에 다른 조각을 추가 할 때마다 충돌을 확인하는 것이 더 효율적입니다. 그 전에는 충돌이 없다고 가정합니다. 이 경우 전체 보드를 검사하는 대신 새 조각에 교차하는 선만 확인하면됩니다. – Dialecticus

답변

-1

문제점은 제가 기울기를 사용하고 있다는 것입니다. 그래서 그것은 경사면 응답의 끝을 잘라 버리고있었습니다. 1.3을 넣거나 1을 넣습니다. 두 번 전환하십시오!


for (int j=0; j<8; j++){ 
    double slope=(yvalues[i]-yvalues[j])/(0.0+xvalues[i]-xvalues[j]); 
    if (slope==-1 || slope==1) return false; 
} 
+0

아니요 아니요 - 계산 된 부동 소수점 값을 비교할 수 없습니다. – stark

+0

자세히 설명해 주시겠습니까? 그게 무슨 뜻 이죠? –

+0

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – stark