保持有关访问状态信息的想法

如何解决保持有关访问状态信息的想法

| 我现在正在制作15谜题解算器(用C ++),但我的程序不仅要解决15谜题,还必须解决3x4谜题,8x8谜题等...-> X x Y谜题。我必须以某种方式保留有关访问状态的信息,我的第一个想法是制作树,例如: 难题:   状态1   1 2   3 0   状态2   1 3   0 2 我留在树上:   根-> 1-> 2-> 3-> 0         \\ _             \\-> 3-> 0-> 2 这对于拼图5x3、6x6等也适用于所有拼图 这个想法行得通,但是浪费了很多内存,并且添加节点需要一些时间:/因此效率很低。 下一个想法是将访问状态保留在stl的std :: map <>中,但是我不知道如何制作良好的哈希函数-从拼图状态中创建快捷方式(因为我不必存储拼图状态,我只需要访问信息,对std :: map的键有什么想法,还是要保留有关状态信息的其他想法?     

解决方法

我将单个状态表示为BigInteger编号(此处提供了c ++实现,或者如果您想在此处实现自己的实现,也可以使用该线程)。 假设您有一个(X,Y)尺寸的拼图,您将使用base = X * Y创建一个数字,并且该数字的数字将代表扁平化为一维的拼图。 例如:
State 1
1 2
3 0
这将被夷为平地
1 2 3 0
然后转换为以4为底的数字:
state = (1 * (4^3)) + (2 * (4^2)) + (3 * 4) + 0;
这将唯一地标识任何难题的任何给定状态。     ,假设您只对求解X * Y感兴趣,其中X,Y <=16。我将通过X * Y字节数组来表示拼图的状态,其中每个字节都给出了一个正方形的值。难题。在怪异的基数中使用字节代替BigInteger可能会为您提供更快的访问和修改时间,因为位算术往往比较慢,并且就内存/速度折衷而言可能不是一个好的总体方法。
template<unsigned X,unsigned Y>
class PuzzleState {
    unsigned char state[X*Y];
    public:
    void set(unsigned x,unsigned y,unsigned char v) {
        state[x+X*y] = v;
    }
    unsigned get(unsigned x,unsigned y) {
        return state[x+X*y];
    }
    bool operator<(const PuzzleState<X,Y>& other) const {
        return memcmp(state,other.state,X*Y) < 0;
    }
};
然后只需将
std::set<PuzzleState<8,8 >
insert
find
方法一起使用即可。在测试性能是否仍然不合适之后,可以使用简单的哈希函数(例如Rolling hash)来抛出哈希表,而不是the7。     ,Zobrist哈希在玩抽象游戏的程序中非常普遍。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?