tic tac toe的阶乘阵列

时间:2012-03-09 04:05:41

标签: c++ logic

我目前正在尝试自学C ++和编程。因此,作为一个初学者项目,我正在制作一种遗传算法,为Tic-Tac-Toe游戏创造最佳AI。我没有参加任何编程课程,所以这不是作业。我对AI非常感兴趣。

所以我试图创建一个阶乘的多维数组,在我的情况下为9! 。例如,如果你做了3个中的一个!它将是数组[3] [6] = {{1,2,3},{1,3,2},{2,3,1},{2,1,3},{3,2,1 },{3,1,2}}。基本上3!或3 * 2 * 1将是您按顺序排列3个数字的方式。

我认为解决方案应该很简单,但我仍然试图找出如何提出一个简单的解决方案。我试图交换它们,试图将它们向右移动,增加等等。有效的方法是显而易见的,我不知道如何编码它们。

所以,如果你知道如何解决这个问题,那就太棒了。如果你能提供更好的编码格式。任何帮助表示赞赏。

我也是用c ++编写的。

3 个答案:

答案 0 :(得分:3)

您可以使用STL的next_permutation函数

http://www.cplusplus.com/reference/algorithm/next_permutation/

答案 1 :(得分:2)

我实际上是手工编写了一个算法。这是:

bool incr(int z[NUM_INDICES]){
    int a=NUM_INDICES-1;
    for(int i=NUM_INDICES-2;i>=0;i--)
      if(z[i]>z[i+1]) a--;
      else break;
    if(a==0) return false;
    int b=2147483647,c;
    for(int i=a;i<=NUM_INDICES-1;i++)
      if(z[i]>z[a-1]&&z[i]-z[a-1]<b){
        b=z[i]-z[a-1];
        c=i;
      }
    int temp=z[a-1]; z[a-1]=z[c]; z[c]=temp;
    qsort(z+a,NUM_INDICES-a,sizeof(int),comp);
    return true;
}

这是增量函数(即你有一个类似[3,2,4,1]的数组,你将它传递给它,并将它修改为[3,4,1,2])。它的工作原理是,如果数组的最后一个 d 元素按降序排列,则下一个数组(按“字母”顺序)应满足以下条件:1)最后一个 d + 1 元素是它们之间的排列; 2) d + 1 -th到最后一个元素是最后一个 d + 1 元素中的下一个最高元素; 3)最后的 d 元素应按升序排列。当你有[2,5,3,8,7,6,4,1]之类的东西时,你可以直观地看到这一点:在这种情况下, d = 5; 3变为最后 d + 1 = 6个元素的下一个最高点;最后 d = 5按升序排列,因此变为[2,5,4,1,3,6,7,8]。

第一个循环基本上决定 d 。它向后循环遍历数组,比较连续元素,以确定最后按降序排列的元素数。在循环结束时,a成为降序序列中的第一个元素。如果a==0,则整个数组按降序排列,无法再进行任何操作。

下一个循环确定 d + 1 -th-to-last元素应该是什么。我们指定它应该是最后一个 d + 1 元素中的下一个最高元素,因此这个循环决定了它是什么。 (注意,z [a-1]是 d + 1 -th-to-last元素。)在该循环结束时,b包含最低z[i]-z[a-1]这是积极的;也就是说,z[i]应该大于z[a-1],但应尽可能低(以便z[a-1]成为下一个最高元素)。 c包含相应元素的索引。我们放弃b因为我们只需要索引。

接下来的三行交换z[a-1]z[c],以便 d + 1 -th-to-last元素获取下一行元素,另一行元素(z[c])保持z[a-1]。最后,我们使用qsort对最后的 d 元素进行排序(comp必须在其他地方声明;请参阅qsort上的C ++文档。

答案 2 :(得分:0)

如果您想要手工制作的功能来生成所有排列,可以使用

#include <cstdio>
#define REP(i,n) FOR(i,0,n)
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define GI ({int t;scanf("%d",&t);t;})

int a[22], n;

void swap(int & a, int & b) {
    int t = a; a = b; b = t;
}

void perm(int pos) {
    if(pos==n) {
        REP(i,n) printf("%d ",a[i]); printf("\n");
        return;
    }
    FOR(i,pos,n) {
        swap(a[i],a[pos]);
        perm(pos+1);
        swap(a[pos],a[i]);
    }
    return;
}

int main (int argc, char const* argv[]) {

    n = GI;
    REP(i,n) a[i] = GI;
    perm(0);

    return 0;
}