携程2017春招编程题——拼图
题目
解题思路
基础的解决算法是BFS队列解决,但是会超时。所以需要去重。
去重要考虑格子重复的情况,
9个格子,所以拼图有9!种状态,建立visited[9!]布尔数组记录访问情况,如何判断两种状态是否相同呢,通过康托展开。
哇,这个康托展开就坑爹了,谁tm学过这个呀,搜了一下才发现原来康拓展开就是通过一个数字来表示一个序列的排列(建立了排列关系 <–> 数字的对应关系)。
康托展开
使用示例来帮助理解利用Cantor展开如何求解本问题。
假如序列s=[“A”,”B”,”C”,”D”]
需要求序列s’=[“D”,”A”,”B”,”C”]是序列s的全排列中的第几个排列,记作X(s’);
X(s’) =
3(在序列DABC中有3个比D小)*3!+
0(在剩下的序列ABC中有0个比A小)*2!+
0(在剩下的序列BC中有0个比B小)*1!+
0(在剩下的序列C中有0个比C小)*0!
=18
代码实现
Todo: 写得比较凌乱,后续会整理
import java.util.*;
public class Main {
private static int[][] sample = { {
1,2,3},{
4,5,6},{
7,8,0} };
private static final int MAX_NUM = 362880;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[][] matrix = new int[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j <