我目前正在尝试自学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 ++编写的。
答案 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;
}