算法设计与分析: 6-20 推箱子问题

6-20 推箱子问题


问题描述

码头仓库是划分为 n×m 个格子的矩形阵列。有公共边的格子是相邻格子。当前仓库中 有的格子是空闲的;有的格子则已经堆放了沉重的货物。由于堆放的货物很重,单凭仓库管 理员的力量是无法移动的。仓库管理员有一项任务,要将一个小箱子推到指定的格子上去。 管理员可以在仓库中移动,但不能跨过已经堆放了货物的格子。管理员站在与箱子相对的空 闲格子上时,可以做一次推动,把箱子推到另一相邻的空闲格子。推箱时只能向管理员的对 面方向推。由于要推动的箱子很重,仓库管理员想尽量减少推箱子的次数。

对于给定的仓库布局,以及仓库管理员在仓库中的位置和箱子的开始位置和目标位置, 设计一个解推箱子问题的分支限界法,计算出仓库管理员将箱子从开始位置推到目标位置所 需的最少推动次数。

数据输入:
第 1 行有 2 个正整数 n 和 m(1<=n,m<=100), 表示仓库是 n×m 个格子的矩形阵列。接下来有 n 行,每行有 m 个字符,表示格子的状态。
S 表示格子上放了不可移动的沉重货物;
w 表示格子空闲;
M 表示仓库管理员的初始位置;
P 表示箱子的初始位置;
K 表示箱子的目标位置。


Java

package Chapter6FenZhiXianJieFa;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class TuiXiangZi {
   

    private static class Position{
   
        int row,col,dir;
    }

    private static int[] op = {
  1,0,3,2};
    private static int m,n,totm,markr;
    private static int[][] grid,reach,mark,low,totr;
    private static int[][][] comp;
    private static long[][][] ans;
    private static Position start,finish,man;
    private static Position[] offset = new Position[4];
    private static char[][] chars;

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        while (true){

            init(input);

            fifobb();

            out();
        }
    }

    private static void init(Scanner input){
        n = input.nextInt();
        m = input.nextInt();

        grid = new int[n+2][m+2];
        reach = new int[n+1][m+1];
        mark = new int[n+1][m+1];
        low = new int[n+1][m+1];
        totr = new int[n+1][m+1];
        ans = new long[n+1][m+1][4];
        comp = new int[n+1][m+1][10];
        chars = new char[n+1][m+1];

        start = new Position();
        finish = new Position();
        man = new Position();

        for(int i=0; i<n+2; i++)
            for(int j=0; j<m+2; j++)
                grid[i][j] = 0;

        String[] str = new String[n+1];
        for(int i=1; i<=n; i++){
            str[i] = input.next();
            System.arraycopy(str[i].toCharArray(),0,chars[i],1,m);
        }
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值