在c ++中实现Brute Force

时间:2013-03-31 18:45:48

标签: c++ brute-force array-algorithms

我有一个问题涉及包含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
}//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 0
1 0 0 0 0
1 0 0 0 0

它只输出“得分”5次,所以似乎忽略了函数中的for循环, bestescore也被设置为一百万个值,然后设置为5.我不是 非常有经验的程序员,所以我可能只是错过了什么...... ??

1 个答案:

答案 0 :(得分:0)

在您的示例中,您只有5条边,因此得分只输出五次。嵌套循环

  

for(int i = 0; i&lt; getal; i ++)
    for(int j = i + 1; j&lt; getal; j ++)

迭代所有可能的边和条件if(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;

一般建议:如果可以,请避免使用公共变量。它们使程序的推理和调试变得复杂。