Как решить 8 ферзей 1D массив с грубой силой?

Мне было дано задание изменить программу 8 Queens для использования одномерного массива и использования грубой силы (уже сделал возврат). Я придумал следующий код:

#include <cmath>
#include <iostream>
using namespace std;

bool ok(int board[8]){

for(int j = 0; j <= 7; j++){ //check for repeating digits
cout << "ok loop 1"<<endl;
for (int k = 0; k <= 7; k++)
{
cout << "ok loop 2"<<endl;
if (board[k] = board[j]){ return false; }
}
}

for(int c = 7; c >= 0; c--){ //check if position is safe
cout << "ok loop 3"<<endl;
//int r = 0;

for(int i = 1; i <= c; i++){
cout << "ok loop 4"<<endl;
if(board[c-i] == c)
return false;
else if ((board[c]-i)>0 && board[c-i]-i == 1)

return false;
else if ((board[c]+i)<=7 && board[c-i]+i == 1)
return false;
} // for loop

} // for loop
return true;
} // okvoid print(int board[8], int c){
cout << "Solution " << c << ": " << endl;
for(int i = 0; i < 8; i++){
{
cout << board[i] <<" ";
}
}

cout << endl;
}int main ()
{

int b[8]={0}; //initialize the array
int count = 0;

for(b[0]=0; b[0]<8; b[0]++)
for(b[1]=0; b[1]<8; b[1]++)
for(b[2]=0; b[2]<8; b[2]++)
for(b[3]=0 ; b[3]<8; b[3]++)
for(b[4]=0; b[4]<8; b[4]++)
for(b[5]=0; b[5]<8; b[5]++)
for(b[6]=0; b[6]<8; b[6]++)
for(b[7]=0; b[7]<8; b[7]++)
if(ok(b))
{
count++;
print(b, count);
}
system("PAUSE");
return 0;
}

Он продолжает работать вечно, и я не уверен почему. Кто-нибудь может помочь мне?

0

Решение

Есть несколько вещей, которые можно улучшить:

  • Если вы передали ссылку на постоянный массив из восьми символов в ok() вместо просто указателя на неконстантные целые, компилятор мог бы рассказать вам об одной из проблем.
  • Сколько разных позиций может иметь королева? Я бы сказал, 64, хотя ваш код предлагает восемь. Я бы начал с документирования фактического значения переменных и констант в вашем коде, потому что вы, похоже, сами запутались там.
  • Вы проверяете, является ли доска [x] доской [y], но при этом x и y равны, и из этого вы утверждаете, что есть повторяющиеся цифры.
  • Вы делаете разницу между разными королевами. Другими словами, ваша программа найдет все варианты того, как королевы могут быть расположены на тех же восьми позициях. Это не неправильно, но неэффективно. Если вы исправите количество позиций, это будет заметно.
1

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

Других решений пока нет …

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