这段程序是求解数字华容道。 就是在N*N的矩阵里,随意放入数字1到N*N-1,留1个空格,然后利用空格移动数字,使的数字按顺序排列。
因为闺女这几天老玩这个,非常溜,1分钟就能完成, 我就想给闺女露一手,编程求解出更快的走法。
一开始的C++程序慢,使因为未unordered_set提供的hash函数太差,改成 hash=hash*13+A[i]之后,C++就比C#更快了。
启发式搜索就是宽度优先搜索中,普通队列换成优先队列,优先搜索最接近目标的分支。会更快找打解法,但是不能保证是最短的走法。
一个输出如下:*表示空格
0------
1 5 8 3
2 6 4 15
10 9 12 7
13 14 11 *
1------
1 5 8 3
2 6 4 15
10 9 12 *
13 14 11 7
2------
1 5 8 3
2 6 4 15
10 9 * 12
13 14 11 7
3------
1 5 8 3
2 6 4 15
10 9 11 12
13 14 * 7
4------
1 5 8 3
2 6 4 15
10 9 11 12
13 14 7 *
5------
1 5 8 3
2 6 4 15
10 9 11 *
13 14 7 12
6------
1 5 8 3
2 6 4 *
10 9 11 15
13 14 7 12
7------
1 5 8 3
2 6 * 4
10 9 11 15
13 14 7 12
8------
1 5 * 3
2 6 8 4
10 9 11 15
13 14 7 12
9------
1 5 3 *
2 6 8 4
10 9 11 15
13 14 7 12
10------
1 5 3 4
2 6 8 *
10 9 11 15
13 14 7 12
11------
1 5 3 4
2 6 * 8
10 9 11 15
13 14 7 12
12------
1 5 3 4
2 6 11 8
10 9 * 15
13 14 7 12
13------
1 5 3 4
2 6 11 8
10 9 15 *
13 14 7 12
14------
1 5 3 4
2 6 11 8
10 9 15 12
13 14 7 *
15------
1 5 3 4
2 6 11 8
10 9 15 12
13 14 * 7
16------
1 5 3 4
2 6 11 8
10 9 * 12
13 14 15 7
17------
1 5 3 4
2 6 * 8
10 9 11 12
13 14 15 7
18------
1 5 3 4
2 6 8 *
10 9 11 12
13 14 15 7
19------
1 5 3 4
2 6 8 12
10 9 11 *
13 14 15 7
20------
1 5 3 4
2 6 8 12
10 9 11 7
13 14 15 *
21------
1 5 3 4
2 6 8 12
10 9 11 7
13 14 * 15
22------
1 5 3 4
2 6 8 12
10 9 * 7
13 14 11 15
23------
1 5 3 4
2 6 8 12
10 9 7 *
13 14 11 15
24------
1 5 3 4
2 6 8 *
10 9 7 12
13 14 11 15
25------
1 5 3 4
2 6 * 8
10 9 7 12
13 14 11 15
26------
1 5 3 4
2 6 7 8
10 9 * 12
13 14 11 15
27------
1 5 3 4
2 6 7 8
10 9 11 12
13 14 * 15
28------
1 5 3 4
2 6 7 8
10 9 11 12
13 14 15 *
29------
1 5 3 4
2 6 7 8
10 9 11 *
13 14 15 12
30------
1 5 3 4
2 6 7 *
10 9 11 8
13 14 15 12
31------
1 5 3 4
2 6 * 7
10 9 11 8
13 14 15 12
32------
1 5 3 4
2 * 6 7
10 9 11 8
13 14 15 12
33------
1 * 3 4
2 5 6 7
10 9 11 8
13 14 15 12
34------
1 3 * 4
2 5 6 7
10 9 11 8
13 14 15 12
35------
1 3 6 4
2 5 * 7
10 9 11 8
13 14 15 12
36------
1 3 6 4
2 5 7 *
10 9 11 8
13 14 15 12
37------
1 3 6 4
2 5 7 8
10 9 11 *
13 14 15 12
38------
1 3 6 4
2 5 7 8
10 9 11 12
13 14 15 *
39------
1 3 6 4
2 5 7 8
10 9 11 12
13 14 * 15
40------
1 3 6 4
2 5 7 8
10 9 11 12
13 * 14 15
41------
1 3 6 4
2 5 7 8
10 * 11 12
13 9 14 15
42------
1 3 6 4
2 * 7 8
10 5 11 12
13 9 14 15
43------
1 3 6 4
* 2 7 8
10 5 11 12
13 9 14 15
44------
1 3 6 4
10 2 7 8
* 5 11 12
13 9 14 15
45------
1 3 6 4
10 2 7 8
5 * 11 12
13 9 14 15
46------
1 3 6 4
10 2 7 8
5 9 11 12
13 * 14 15
47------
1 3 6 4
10 2 7 8
5 9 11 12
13 14 * 15
48------
1 3 6 4
10 2 7 8
5 9 * 12
13 14 11 15
49------
1 3 6 4
10 2 * 8
5 9 7 12
13 14 11 15
50------
1 3 * 4
10 2 6 8
5 9 7 12
13 14 11 15
51------
1 * 3 4
10 2 6 8
5 9 7 12
13 14 11 15
52------
1 2 3 4
10 * 6 8
5 9 7 12
13 14 11 15
53------
1 2 3 4
* 10 6 8
5 9 7 12
13 14 11 15
54------
1 2 3 4
5 10 6 8
* 9 7 12
13 14 11 15
55------
1 2 3 4
5 10 6 8
9 * 7 12
13 14 11 15
56------
1 2 3 4
5 * 6 8
9 10 7 12
13 14 11 15
57------
1 2 3 4
5 6 * 8
9 10 7 12
13 14 11 15
58------
1 2 3 4
5 6 7 8
9 10 * 12
13 14 11 15
59------
1 2 3 4
5 6 7 8
9 10 11 12
13 14 * 15
60------
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 *
【 在 DoorWay 的大作中提到: 】
: 大眼一扫,优先队列,上次见是opecv里分水岭算法。
: 算法mental model是根据灰度值,将图像素三维化,假设有高度,然后注水。
: 低的地方汇聚成洼,高的地方分割成坝,达到分割的效果。
: ...................
--
FROM 123.112.64.*