реализация грубой силы в переполнении стека

У меня проблема с оптимизацией игры, в которую входят 2 игрока.
Таким образом, мы имеем неориентированный связный граф с множеством ребер и несколькими вершинами.
Каждый игрок должен удалить ребра, и если вершина изолирована, его счет увеличивается на
один, а затем вы должны удалить другой край. График представлен в так называемом
«матрица смежности». Для каждого в массиве существует связь между двумя вершинами. Например, если у нас есть треугольник, у нас есть следующий массив:

0 1 1 первый ряд

1 0 1 второй ряд

1 1 0 третий ряд

строки соответствуют вершинам, а столбцы соответствуют возможным связям с другими вершинами. Мы назначены использовать рекурсивную функцию для применения
Грубая сила. Я много думал о написании кода для этой функции. я
реализовал некоторый код и скомпилировал и запустил его. Я понятия не имею, почему это не так
функция. Мой код для этой функции:

   class Matrix {
public:
int berekenZet (bool** array, bool player);
int berekenScore (bool** array, int rij, int kolom);
bool checkRij (bool** array, int rij);
void setGetal (int nummer) {getal = nummer;};
Matrix ();private:
int getal;int maxScoreA;
int huidigScore;
int maxverschil;
int maxScoreB;
int tellerHuidig;

Matrix :: Matrix () {

  huidigScore = 0;
maxScoreA = 0;
maxScoreB = 0;

}

 bool Matrix::checkRij (bool** array, int rij) {for (int i=0; i<getal; i++) {
if (array[rij][i] == true)
return false;
}
return true;

}

    int Matrix::berekenScore (bool** Array, int rij, int kolom) {
if (checkRij (Array, rij) == true )
huidigScore ++;
if (checkRij (Array, kolom) == true)
huidigScore ++;
return huidigScore;

}

  int Matrix::berekenZet (bool** array, bool player) {
int score = 0;
int bestescore = -5;
int slechtstescore = 5;
int something;
something = 0;

for(int i = 0; i < getal; i++){
for(int j = i + 1; j <getal; j++){
huidigScore = 0;

if(array[i][j]){
something++;
array[i][j] = false;
array[j][i] = false;
score = 0;
if(player == true){
score = score + berekenScore(array, i ,j );
}
else{
score = score - berekenScore(array, i, j);
}
cout << "player" << player << endl;
cout << "score" << score << endl;if(huidigScore == 0)
score = score + berekenZet(array, !player);
else
score = score + berekenZet(array, player);if(player == true && score > bestescore)
bestescore = score;
else if(player == false && score < slechtstescore)
slechtstescore = score;array[i][j] == true;
array[j][i] == true;

} //if
}//for
}//forif(player == true && something != 0){
cout << "bestescore" << bestescore << endl;
return bestescore;
}//  if outside of double for loop
else if(player == false && something != 0){
cout << "slechtstescore" << slechtstescore << endl;
return slechtstescore;
} // else if outside of double for loop

else if(something = 0){
cout << "bestescore" << bestescore << endl;
return 0;

}  // determine whether array was empty when function was called

bestescore и slechtstescore — лучшие и худшие.
berekenScore корректирует количество очков, заработанных после преимущества
удаляется и сохраняет его в huidigScore. Так что в основном 0, 1 или 2.

Я вызываю эту функцию в int main:

cout << "Aantal takken: " << takken << endl;

a = matrix.berekenZet(Array, player);

Я запустил его, используя следующую матрицу смежности:

5

0 1 1 1 1
1 0 1 0 0
1 1 0 0 0
1 0 0 0 0
1 0 0 0 0

Он выводит «Score» всего 5 раз, так что кажется, что он игнорирует циклы for в функции,
Кроме того, bestescore однажды установлен в несколько миллионов значение, а затем установлено в 5. Я не
очень опытный программист, так что я мог бы что-то пропустить .. ??

-1

Решение

В вашем примере у вас всего 5 ребер, и, таким образом, результат выводится всего пять раз. Вложенный цикл

для (int i = 0; i < getal; я ++)
для (int j = i + 1; j < getal; j ++)

перебирает все возможные ребра и условия, если (array [i] [j]) отфильтровывает истинные ребра, поэтому цикл будет выполнять только | E | раз.

Кроме того, в цикле вы устанавливаете

array[i][j] = false;
array[j][i] = false;

а потом

array[i][j] == true;
array[j][i] == true;

и, таким образом, только один край удаляется за один раз. Возможно, вам нужен еще один цикл, который удаляет несколько ребер за раз, чтобы получить грубую реализацию.

Изменить: Вы, кажется, не сбрасывает huidigScore при каждом вызове. Я бы порекомендовал изменить ваши вспомогательные функции следующим образом:

int Matrix::berekenScore (bool** Array, int rij, int kolom)
{
int huidigScore = 0;
if (checkRij (Array, rij) == true )
huidigScore ++;
if (checkRij (Array, kolom) == true)
huidigScore ++;
return huidigScore;
}

Вышеупомянутая функция имеет huidigScore в качестве закрытой переменной. Теперь вместо следующего фрагмента кода:

if(player == true){
score = score + berekenScore(array, i ,j );
}
else{
score = score - berekenScore(array, i, j);
}
cout << "player" << player << endl;
cout << "score" << score << endl;

вы можете иметь

int huidigScore = berekenScore(array, i ,j )
if(player == true){
score = score + huidigScore;
}
else{
score = score - huidigScore;
}
cout << "player" << player << endl;
cout << "score" << score << endl;

Общий совет: по возможности избегайте использования публичных переменных. Они затрудняют рассуждение и отладку программ.

0

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

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