华容道3x3的技巧_我发现总结的关于数字华容道的技巧规律

数字华容道,一个很有趣的游戏,就是在一个n阶数字阵里,只有一个空格,位置打乱,让重新按顺序排好。自己做着做着,发现可以有方法规律,并且百用百顺,就总结并拿出来和大家共同分享探讨:一行一行的弄顺,

拿四阶的举例:

先把1,2,3,4无论是什么顺序的弄到第一行,

第二行无论是什么数,无论是什么顺序的,不予理睬,把第一行弄顺即可,

比如2,4,3,1

先把1弄到2之前,再把3弄到4之前,具体如何摆放,可能还需要和下一行的(2,1)(2,2)(2,3)位置上的数字互换,也可能不需要,这里的(x,y)是指的下一行的x代表的行数和y代表的列数,

以此类推,直到把倒数第二行的数字也都弄好为止,

最后一行的数字在倒数第二行的数字不变位置的情况下,

按数序排好即可。

还有,在具体每

一行的位置排序时,要注意

如每一个位置的数字只能跳到相隔偶数的个数的位置上面,

拿一个4×4举例,

第一行是2,3, 4,1

第二行是6,5,8, 7

连在一起可以看成一个数字环,首尾相接

就是2, 3,4,1,7,8,5,6,也可以看成78562341

第一步:5跳2个数,就是25341786,

第二步:然后1跳4个数,变成12534786,

第三步:5跳4个数,变成12347856

第四步:7跳2个数变成12348576

第五步:5跳2个数变成12348765

数字环形成顺序正确,形成两行

第一行是1234,第二行是5678

至于为什么每个数都能跳过偶数个数的位置,原因就是因为每个数在通过跳跃别的数字而改变位置时,必须是它的上方或者下方出现空格时,那就是在向它同列的下一行或者上一行移位,那就是相当于跳过了两倍的它旁边的列数的个数,那就是等于跳过偶数个数的数字位置。

由此我还想到当n* n个数字华容道时,在n-1行的数字华容道都排好时,很有可能会出现最后一行却还不好的情况,那就是这个游戏没设计好,它的位置跳过的数字个数总和是奇数个,而不是偶数个,拿3*3的数字华容道第三行的87来举例,需要移动的位置个数是1个,就是把8移动到7后面就行。如果在上面2行都排好的情况下,这行如果是87

那么这个数字华容道就是做不了的。

再举例,如果是4×4,假定前面全部排好,如果最后一行是13,16,15,14,那就是需要跳过奇数个位置的数字,首先,14移到16前面,需要跳过2个数,那就是13,14, 16,15,15跳到16前面,跳过1个数,那还是无法实现的。

可以这样证明,一个数列,打乱的那种,如果需要跳过的数字个数和是奇数个,但是如果你每次跳过的数字(就像数字华容道那样),个数只能是偶数个,那么是不可能能达到目标的,因为你跳过的的数字个数的总和只可能是偶数个,不可能是奇数个。

图片发自简书App

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个自动复原数字华容道3x3的Python程序: ``` import copy def get_blank_pos(puzzle): for i in range(3): for j in range(3): if puzzle[i][j] == 0: return (i, j) def move(puzzle, direction): i, j = get_blank_pos(puzzle) new_puzzle = copy.deepcopy(puzzle) if direction == 'up': new_puzzle[i][j], new_puzzle[i-1][j] = new_puzzle[i-1][j], new_puzzle[i][j] elif direction == 'down': new_puzzle[i][j], new_puzzle[i+1][j] = new_puzzle[i+1][j], new_puzzle[i][j] elif direction == 'left': new_puzzle[i][j], new_puzzle[i][j-1] = new_puzzle[i][j-1], new_puzzle[i][j] elif direction == 'right': new_puzzle[i][j], new_puzzle[i][j+1] = new_puzzle[i][j+1], new_puzzle[i][j] return new_puzzle def is_solved(puzzle): return puzzle == [[1, 2, 3], [4, 5, 6], [7, 8, 0]] def solve(puzzle, moves=[]): if is_solved(puzzle): return moves i, j = get_blank_pos(puzzle) if i > 0: up = move(puzzle, 'up') if up not in moves: up_moves = moves + ['up'] up_solution = solve(up, up_moves) if up_solution: return up_solution if i < 2: down = move(puzzle, 'down') if down not in moves: down_moves = moves + ['down'] down_solution = solve(down, down_moves) if down_solution: return down_solution if j > 0: left = move(puzzle, 'left') if left not in moves: left_moves = moves + ['left'] left_solution = solve(left, left_moves) if left_solution: return left_solution if j < 2: right = move(puzzle, 'right') if right not in moves: right_moves = moves + ['right'] right_solution = solve(right, right_moves) if right_solution: return right_solution puzzle = [[2, 3, 6], [1, 5, 0], [4, 7, 8]] solution = solve(puzzle) print(solution) ``` 该程序使用深度优先搜索算法来寻找数字华容道3x3的解决方案。它将从当前状态开始,并尝试将空格向上、下、左或右移动,并递归地搜索每个可能的下一步状态,直到找到一个解决方案或搜索完所有可能的状态。如果找到解决方案,则返回移动序列。如果没有找到解决方案,则返回None。 在程序中,get_blank_pos函数用于获取空格的位置。move函数用于移动数字块。is_solved函数用于检查数字华容道是否已经被解决。solve函数是程序的主要部分,它递归地搜索数字华容道的状态,并返回移动序列。最后,程序定义了一个初始数字华容道的状态,并调用solve函数来寻找解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值