Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >tic tac toe的阶乘数组

tic tac toe的阶乘数组
EN

Stack Overflow用户
提问于 2012-03-09 04:05:41
回答 3查看 607关注 0票数 2

我目前正在尝试自学C++和一般编程。因此,作为一个初学者项目,我正在制作一个遗传算法,它为Tic-Tac-Toe游戏创建了一个最优的人工智能。我没有参加任何编程课程,所以这不是家庭作业。我只是对人工智能很感兴趣。

所以我尝试创建一个阶乘的多维数组,在我的例子中是9!例如,如果你做了3个中的一个!它将是array3 ={ {1,2,3},{1,3,2},{2,3,1},{2,1,3},{3,2,1},{3,1,2}}。基本上是3!或者3*2*1是您可以按顺序排列3个数字的数量。

我认为解决方案应该是简单的,但我却卡住了,试图找出一个简单的解决方案。我试着交换它们,试着将它们向右移动,递增等等。有效的方法是显而易见的,我不知道如何对它们进行编码。

所以,如果你知道如何解决这个问题,那就太好了。如果你能给出一个编码格式,那就更好了。任何帮助都是非常感谢的。

另外,我用c++编写了这个代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-09 04:10:50

你可以使用STL的next_permutation函数

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

票数 3
EN

Stack Overflow用户

发布于 2012-03-09 05:06:04

实际上,我曾经手工写过一个算法。这就是它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的最后一个元素是最后的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个元素应该是什么。我们指定它应该是最后一个d+1元素中的下一个最高元素,所以这个循环决定了它是什么。(请注意,za-1是d+1倒数第二个元素。)在该循环结束时,b包含的最低z[i]-z[a-1]为正;也就是说,z[i]应大于z[a-1],但应尽可能小(以便z[a-1]成为下一个最高的元素)。c包含相应元素的索引。我们丢弃了b,因为我们只需要索引。

接下来的三行交换了z[a-1]z[c],这样d+1倒数第二个元素就得到了下一个元素,而另一个元素(z[c])则保持z[a-1]。最后,我们使用qsort对最后d个元素进行排序(comp必须在其他地方声明;请参阅qsort上的C++文档)。

票数 2
EN

Stack Overflow用户

发布于 2012-03-09 10:45:10

如果您需要一个手工创建的函数来生成所有排列,您可以使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9628782

复制
相关文章
Wikipedia的方言版本
闽东话版本: http://cdo.wikipedia.org/wiki/ 闽南话版本: http://zh-min-nan.wikipedia.org/wiki/ 客家话版本: http://hak.wikipedia.org/wiki/ 赣语版本: http://gan.wikipedia.org/wiki/ 吴语版本: http://wuu.wikipedia.org/wiki/ 文言版本: http://zh-classical.wikipedia.org/wiki/ 粤语版本: http://zh-yue.wikipedia.org/wiki/
ruanyf
2018/09/21
1.5K0
Wikipedia pageview数据获取(bigquery)
维基百科pageview数据是Wikimedia技术团队所维护的访问量数据集。该数据集自2015年五月启用,其具体的pageview定义为对某个网页内容的请求,会对爬虫和人类的访问量进行区分,粒度为小时级别,如下图:
千灵域
2022/06/17
2.7K0
Wikipedia pageview数据获取(bigquery)
Wikipedia创始人访谈
2001年,当他决定创办维基百科的时候,所有人都感到太疯狂了。办一个网上的百科全书,访问者可以自由编辑,连注册也不需要,你想怎么写就怎么写,目标是整理和呈现人类所有的知识。这怎么可能呢?!......
ruanyf
2018/09/21
1.1K0
Java并发编程:线程池的使用
Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?   在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPo
Ryan-Miao
2018/03/13
1.1K0
【编程基础】Java Comparator接口的使用
在实际编程中我们经常会用到集合或者数组,有的时候你需要对这个集合中的元素就行排序,那这个时候就用到了Comparator接口,先看一下接口的原型: public interface Comparator<T> { /** * Compares the two specified objects to determine their relative ordering. The ordering * implied by the return value of this method for all po
程序员互动联盟
2018/03/14
7830
10分钟拥有自己的Wikipedia
谁是花和尚? 花和尚是一个定居西雅图的程序员,拥有多年系统设计和开发经验。喜欢研究和总结System Design, 并传授给大家。花和尚在MITBBS一篇 "我的System Design总结" 文章获得超过8万访问量,并被多家网站和博客转载。 引子 相信你一定用过Wikipedia。它简单明了的页面使内容容易查找和阅读。但你有没有想过自己也可以轻松获得一个专属Wikipedia? 背景 小编从一毕业进入某电商公司,就在公司开始使用一款与Wikipedia类似的内部网站。写team wiki,项目requ
包子面试培训
2018/04/20
4.1K0
10分钟拥有自己的Wikipedia
Flink实战:消费Wikipedia实时消息
https://blog.csdn.net/boling_cavalry/article/details/85205622
程序员欣宸
2019/06/02
8380
Flink实战:消费Wikipedia实时消息
写给NLP研究者的编程指南
作者 | 赤乐君,日本某大手研发部门的NLP工程师。关注关系抽取与知识图谱的相关研究。
AI科技大本营
2019/05/06
5510
写给NLP研究者的编程指南
Java并发编程之join方法的使用
在多线程编程中,有时候一个线程的执行可能要依赖于另外一个线程的执行结果才能执行,JDK提供了join方法来实现这种功能。
布禾
2021/03/15
5400
Java-GUI编程之ImageIO的使用
在实际生活中,很多软件都支持打开本地磁盘已经存在的图片,然后进行编辑,编辑完毕后,再重新保存到本地磁盘。如果使用AWT要完成这样的功能,那么需要使用到ImageIO这个类,可以操作本地磁盘的图片文件。
愷龍
2022/09/26
4240
Java-GUI编程之ImageIO的使用
java并发编程(4)--线程池的使用
转载:http://www.cnblogs.com/dolphin0520/p/3932921.html 一. java中的ThreadPoolExecutor类 java.util.concurrent.ThreadPoolExecutor类时线程池中最核心的一个类,因此如果要透彻的了解java中线程池,必须先了解这个类。下面看ThreadPoolExecutor类的具体实现源码: 在ThreadPoolExecutor类中提供了四个构造方法: public class ThreadPoolExecuto
Ryan-Miao
2018/03/13
7660
Java 并发编程:volatile的使用及其原理
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 一、volatile的作用   在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchro
用户2140019
2018/05/18
7230
Java 并发编程:volatile的使用及其原理
一、volatile的作用   在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用Synchronized来解决问题。而volatile关键字就是Java中提供的另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,
用户2140019
2018/06/25
4570
自然语言处理(NLP)入门指南
授权转载自数据派THU ID:DatapiTHU 作者:Melanie Tosik 翻译:闵黎 校对:丁楠雅 Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过
大数据文摘
2018/05/24
1.4K0
【超全资源】自然语言处理(NLP)入门学习资源清单(部分资料下载)
Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线。回顾她的学习历程,她为期望入门自然语言处理的初学者列出了一份学习资源清单。
新智元
2018/03/27
3K0
【超全资源】自然语言处理(NLP)入门学习资源清单(部分资料下载)
Lombok 使用详解,简化Java编程
在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求
用户4172423
2019/11/28
5640
使用Java实现面向对象编程
使用Java实现面向对象编程 源码展示: 1 package cdjj.s2t075.com; 2 import java.util.Scanner; 3 public class Door { 4 /* 5 * Door为门类 6 * 它包括:开门和关门的操作 7 * 然而,因为要通过记录Person输入的信息,交由 8 * Computer计算机类进行处理,之后,再交由Door门类 9 * 进行处理所以Person要继承于Com
用户1112962
2018/07/04
1.1K0
使用Java实现面向对象编程
第一章-对象和封装 上机练习1-5答案略 简答题4 public class Student1 { String name; //姓名 private int age; //年龄 public int getAge() { return age; } public void setAge(int age) { if (age>=16) { this.age = age; }
星辰xc
2022/04/09
8390
使用Java实现面向对象编程
Lombok 使用详解,简化Java编程
在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求
码农小胖哥
2019/12/10
6420
Lombok 使用详解,简化Java编程
【独家】自然语言处理(NLP)入门指南
致谢 钟崇光博士参与了数据派THU于6月5日、THU数据派于6月8日发布的《循序渐进提升Kaggle竞赛模型精确度,以美国好事达保险公司理赔为例》一文的校对工作,并且给出了许多有建设性的意见,在此数据派翻译组对钟博士表达诚挚的感谢! 作者:Melanie Tosik 翻译:闵黎 校对:丁楠雅 本文长度为1100字,建议阅读3分钟 Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线。回顾她的学习历程,她为期望入门自然语言处理的初学者
数据派THU
2018/01/29
2K0
【独家】自然语言处理(NLP)入门指南

相似问题

使用PHP的NLP编程工具?

33

java中的Wikipedia Api

11

使用Pythons Wikipedia提取多个Wikipedia页面

11

Java中的简单NLP

11

如何使用Java处理Selenium中的Wikipedia下拉列表

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文