Диагональный тест на 8 королев

Я полностью осознаю, что этот код неэффективен … Я новичок в 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;}

0

Решение

Проблема была в том, что я использовал 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;
}
-1

Другие решения


По вопросам рекламы [email protected]