-1

2 人のプレーヤーを含むゲームの最適化を扱う問題があります。したがって、多数の辺といくつかの頂点を持つ無向連結グラフがあります。各プレイヤーはエッジを削除する必要があり、頂点が孤立している場合、スコアが 1 増加し、別のエッジを削除する必要があります。グラフは、いわゆる「隣接行列」で表されます。配列内のそれぞれについて、2 つの頂点間の接続があります。たとえば、三角形がある場合、次の配列があります。

0 1 1 最初の行

1 0 1 秒の行

1 1 0 3行目

行は頂点に対応し、列は他の頂点への可能な接続に対応します。ブルートフォースを適用するために再帰関数を使用するように割り当てられています。私はこの関数のコードを書くために多くのことを考えました。いくつかのコードを実装し、コンパイルして実行しました。機能しない理由がまったくわかりません。この関数の私のコード:

   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;

マトリックス::マトリックス() {

  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
}//for 


if(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
1 0 0 0
1 0 0 0 0

「スコア」を 5 回だけ出力するため、関数内の for ループを無視しているように見えます。また、bestescore は一度数百万の値に設定され、次に 5 に設定されます。私は経験豊富なプログラマーではないので、何かに欠けている..??

4

1 に答える 1