携程2017春招编程题——拼图(BFS模板题)

该博客介绍了携程2017年春季招聘中的一道编程题,涉及拼图问题的解决。博主通过使用广度优先搜索(BFS)算法来解决此题,但由于存在大量状态,原始BFS会超时。为避免状态重复,博主引入了康托展开进行状态编码与去重。康托展开是一种将序列排列映射为数字的方法,帮助判断不同状态。博客中通过举例解释了康拓展开的运用,并提到后续会整理代码实现部分。
摘要由CSDN通过智能技术生成

携程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 < 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值