- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
第一次来这里。
我正在使用递归开发 Peg Puzzle php 求解器。对于小而简单的板,我得到了想要的结果(脚本正确解决了难题),但对于更大和完整的板(即所有插槽,但一个被占用),我得到了 php 超时。我需要让它与 7x7 板一起工作,布局如下:
x x 1 1 1 x x
x x 1 1 1 x x
1 1 1 1 1 1 1
1 1 1 0 1 1 1
1 1 1 1 1 1 1
x x 1 1 1 x x
x x 1 1 1 x x
最佳答案
我以前用 c++ 和 c# 写过这个。我可以告诉你 7x7 阵列不是最好的。考虑标准的深度优先搜索算法和作为位板的板表示。如果您愿意,我可能可以在 c 中发布完整的解决方案,但可以使用不同的电路板。
还考虑到解决方案需要深度优先搜索,您确实无法绕过递归。我的第一次尝试做了一些类似于你正在做的事情,而且速度很慢。位板实现在几秒钟内完成,而不是几分钟。
编辑:
这是我对三角形形状的 15 个钉板的解决方案。除了三角形的顶部之外,起始板上的所有钉都已就位,获胜解决方案被定义为最后一个钉在顶部位置。除了您需要重新定义哪些移动可用以及哪些移动是合法的表格之外,该算法应该对您同样有效。
基本解释: 棋盘是这样排列的:
p1
p2 p3
p4 p5 p6
p7 p8 p9 pa
pb pc pd pe pf
#include <vector>
#include <iostream>
using namespace std;
typedef short state_t;
struct Move {
short move;
const char * desc;
};
typedef Move move_t;
struct Options {
short moves[4];
int size;
};
// name the bits
# define P1 1
# define P2 1 << 1
# define P3 1 << 2
# define P4 1 << 3
# define P5 1 << 4
# define P6 1 << 5
# define P7 1 << 6
# define P8 1 << 7
# define P9 1 << 8
# define P10 1 << 9
# define P11 1 << 10
# define P12 1 << 11
# define P13 1 << 12
# define P14 1 << 13
# define P15 1 << 14
// not valid location
# define P16 1 << 15
// move triplets
Options options[15] = {
{{P1|P2|P4, P1|P3|P6}, 2},
{{P2|P4|P7, P2|P5|P9},2},
{{P3|P5|P8, P3|P6|P10},2},
{{P1|P2|P4, P4|P7|P11, P4|P5|P6, P4|P8|P13},4},
{{P5|P8|P12, P5|P9|P14},2},
{{P1|P3|P6, P4|P5|P6, P6|P9|P13, P6|P10|P15},4},
{{P7|P4|P2, P7|P8|P9},2},
{{P8|P5|P3,P8|P9|P10},2},
{{P9|P8|P7,P9|P5|P2},2},
{{P10|P6|P3,P10|P9|P8},2},
{{P11|P7|P4,P11|P12|P13},2},
{{P12|P8|P5,P12|P13|P14},2},
{{P13|P12|P11,P13|P14|P15,P13|P8|P4,P13|P9|P6},4},
{{P14|P9|P5,P14|P13|P12},2},
{{P15|P10|P6,P15|P14|P13},2}
};
// legal moves
Options legal[15] = {
{{P1|P2, P1|P3}, 2},
{{P2|P4, P2|P5},2},
{{P3|P5, P3|P6},2},
{{P4|P2, P4|P7, P4|P5, P4|P8},4},
{{P5|P8,P5|P9},2},
{{P6|P3, P6|P5, P6|P9, P6|P10}, 4},
{{P7|P4, P7|P8},2},
{{P8|P5, P8|P9},2},
{{P9|P8,P9|P5},2},
{{P10|P6,P10|P9},2},
{{P11|P7,P11|P12},2},
{{P12|P8,P12|P13},2},
{{P13|P12,P13|P14,P13|P8,P13|P9},4},
{{P14|P9,P14|P13},2},
{{P15|P10,P15|P14},2}
};
// for printing solution
struct OptionDesc {
const char* name[4];
int size;
};
OptionDesc desc[15] = {
{{"p1 => p4", "p1 => p6"}, 2},
{{"p2 => p7", "p2 => p9"}, 2},
{{"p3 => p8", "p3 => p10"}, 2},
{{"p4 => p1", "p4 => p11", "p4 => p6", "p4 => p13"}, 4},
{{"p5 => p12", "p5 => p14"}, 2},
{{"p6 => p1", "p6 => p4", "p6 => p13", "p6 => p15"}, 4},
{{"p7 => p2", "p7 => p9"}, 2},
{{"p8 => p3", "p8 => p10"}, 2},
{{"p9 => p7", "p9 => p2"}, 2},
{{"p10 => p3", "p10 => p8"}, 2},
{{"p11 => p4", "p11 => p13"}, 2},
{{"p12 => p5", "p12 => p14"}, 2},
{{"p13 => p11", "p13 => p15", "p13 => p4", "p13 => p6"}, 4},
{{"p14 => p5", "p14 => p12"}, 2},
{{"p15 => p6", "p15 => p13"}, 2}
};
int LEGAL_COUNT = sizeof (legal) / sizeof (Options);
state_t START = P2|P3|P4|P5|P6|P7|P8|P9|P10|P11|P12|P13|P14|P15;
// make move: just xor
inline void make_move(state_t& s, move_t m)
{
s ^= m.move;
}
// undo move: just xor
inline void unmake_move (state_t& s, move_t m)
{
s ^= m.move;
}
// define end state as peg in top position
inline bool end_state (state_t s)
{
return (s ^ START) == (START|P1);
}
// generates moves from table of legal moves, and table of all possible move options
inline void generate_moves(state_t s, vector<move_t>& moves)
{
for (int i = 0; i < LEGAL_COUNT; i++) {
for (int j = 0; j < legal[i].size; j++) {
short L = legal[i].moves[j];
short M = L ^ options[i].moves[j];
if ((s & L) == L && (s & M) == 0) {
move_t m;
m.move = options[i].moves[j];
m.desc = desc[i].name[j];
moves.push_back(m);
}
}
}
}
// basic depth first search:
bool dfs (state_t& s, int& count)
{
bool found = false;
if (end_state(s)) {
count++;
return true;
}
vector<move_t> moves;
generate_moves(s, moves);
for (vector<move_t>::iterator it = moves.begin();
it != moves.end(); it++) {
make_move (s, *it);
found = dfs(s,count);
unmake_move(s, *it);
if (found && 0) {
cout << it->desc << endl;
return true;
}
}
return false;
}
void init(state_t& s)
{
s = START;
}
int main(int argc, char* argv[])
{
state_t s;
int count = 0;
init(s);
bool solved = dfs (s, count);
//cout << "solved = " << solved << endl;
cout << "solutions = " << count << endl;
char c;
cin >> c;
return 0;
}
关于php - php Peg Puzzle 解算器超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393391/
以下是来自Interviewstreet的问题我没有从他们的网站上得到任何帮助,所以在这里提问。我对算法/解决方案不感兴趣,但我不理解他们作为第二个输入示例给出的解决方案。任何人都可以帮助我理解问题陈
根据我的理解,创建一个可解决的滑动拼图必须遵循以下规则: A. If the grid width is odd, then the number of inversions in a solvabl
我编写了一系列函数来尝试解决 N 难题/8 难题。 我对自己处理拼图的能力感到非常满意,但在如何迭代和找到最佳路径方面苦苦挣扎。我的技能也不是 OOP,所以功能很简单。 这个想法显然是为了减少 her
我有些摩尔斯电码丢失了字母之间的空格,我的挑战是找出消息中所说的内容。到目前为止,由于可能存在大量的组合,我有点迷失了。 这是关于我收到的消息的所有信息。 输出将为英语 总是会有有意义的翻译 这是示例
如果我知道,变量 a,b,c,d,e 有多少可能的组合: a+b+c+d+e = 500 并且它们都是整数且 >= 0,所以我知道它们是有限的。 最佳答案 @Torlack、@Jason Cohen:
检查 n 的数组是否整数包含 3 个可以形成三角形的数字(即两个数字中任何一个的总和大于第三个)。 显然,这可以在 O(n) 中完成。时间。 (明显的 O(n log n) 解决方案是对数组进行排序,
我有兴趣实现 14-15 puzzle : 我正在创建一个值 0 - 15 按递增顺序排列的数组: S = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
Closed. This question is off-topic。它当前不接受答案。 想要改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。 已关闭
所以,我对数独游戏的生成做了大量的阅读。据我所知,获得所需难度的数独谜题的标准方法是生成一个谜题,然后对其进行评分,然后重复,直到获得可接受的评分。这可以通过使用一些更复杂的求解模式(XY-wing、
如何混合两个ARGB像素? 例 在这里,A是(带有Alpha的红色),而B是(带有Alpha的蓝色)。 最佳答案 取自获得图像的同一Wikipedia文章: 转换为介于0到255之间的值: rOut
Closed. This question is off-topic。它当前不接受答案。 想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。 已关闭8
Joel 在他的 Guerrilla Guide to Interviewing 中提到计算一个字节中设置位的数量是一个编程问题。 ,并谈到了一种利用查找表中出现的模式的方法。在我发现这种模式后不久,
我在做一些回顾时遇到了这个报告的面试问题(以下引用是我找到的关于这个问题的所有信息): Given a function for a fair coin, write a function for a
我遇到了这个问题:说给定两个权重1和3,您可以权衡1,2(乘以3-1),3,4(乘以3 + 1)(使用平衡的两面)。现在找到最小的砝码数量,以便可以测量1到1000。 答案是1,3,9,27 ...
Locked. This question and its answers are locked因为该问题是题外话,但具有历史意义。它当前不接受新的答案或互动。 我使用这些规则制作了最终的笑声发生器。
左边是布局的正常状态。右边是布局的展开状态。 我的问题是我不知道如何让粉色框在它们的单元格中居中,并且随着布局向任何方向增长,粉色框之间的绿线连接起来。 只有这两个 View 的 AutoSizing
考虑以下代码: template struct S { }; template struct B; template class C> struct B> { void f() { } };
问题: 编写一个程序来删除出现在“所有”字符串中的片段,其中一个片段是 3 个或更多个连续的单词。 示例: 输入: s1 = "正在下雨,我想开车回家。"; s2 = "下雨了,我想去滑雪。"; s3
请检查以下程序。 #include struct st { int a ; } fn () { struct st obj ; obj.a = 10 ; return obj ; } int
我一直在研究这个 Prolog 逻辑问题。它得到了不正确的结果,运行程序本身需要一段时间,这是我更关心的。逻辑问题如下: Alex, Bret, Chris, Derek, Eddie, Fred,
我是一名优秀的程序员,十分优秀!