8皇后的对角测试

时间:2015-02-06 15:55:52

标签: c++ diagonal n-queens

我完全清楚这段代码效率不高......我是C ++的新手,这是我第一次尝试解决方案......

问题是,当我运行程序时,它不会返回任何结果。我已经尝试过调试,看来我的问题出在对角线测试......

我意识到当我设置斜率== 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 个答案:

答案 0 :(得分:-1)

问题是我使用的是int slope。所以它截断了斜率答案的结束。并将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;
}