Хорошо, так что для моего назначения мне нужно 1-8 чисел в кресте.В массиве соседние поля не могут быть последовательными.Вывод должен быть Решение № 1
53
2817
64
Решение № 2
64
2817
53
Решение № 3
35
7182
46
Решение № 4
46
7182
35
Однако в моей программе у меня есть нули, и я не могу понять, где в моем алгоритме возникают 0.Я попытался выяснить это путем отладки программы, однако мне все еще нужно больше практики отладки программы.Может кто-нибудь дать мне указание, где найти проблему в моем коде.Мой код ниже:
#include <iostream>
#include <cmath>
using namespace std;
bool okay(int q[], int col) {
static int a[8][5] = { // Helper Array
{-1},
{0, -1},
{0, 1, -1},
{0, 2, -1},
{1, 2, -1},
{1, 2, 3, 4, -1},
{2, 3, 5, -1},
{4, 5, 6, -1}
};
for (int i = 0; i < col; i++){ //row check
if (q[i] == q[col])
return false;
}
for (int i = 0; a[col][i] != -1; i++){ //check if numbers are consecutive
if (abs(q[col] - q[a[col][i]]) == 1)
return false;
}
return true;
}
void backtrack(int& c){ //
--c;
if (c < 0)
exit (1);
}
void print(int q[]){
static int solutions = 0;
cout << "Solution#" << ++solutions << "\n";
cout << " " << q[1] << q[4] << "\n";
cout << q[0] << q[2] << q[5] << q[7] << "\n";
cout << " " << q[3] << q[6] << "\n\n";
}
int main(){
int q[8];
int c = 0;
q[c] = 1; //place
while (true){ //backtrack will end loop once solution is found
while (c >= 0){ //
++c;
if (c == 8){ // if all solutions were found print
print(q);
backtrack(c);
}
else {
q[c] = 0;
}
while ( c >= 0){
++q[c];
if (q[c] > 8){ //if no solutions were found in a row
backtrack(c);
continue;
}
else {
if (okay(q, c)) { //if number is ok break and go to next col
break;
}
}
}
}
}
}