`
128kj
  • 浏览: 599950 次
  • 来自: ...
社区版块
存档分类
最新评论

求推箱子的最小步数(java)

阅读更多
题目(poj1475):推箱子,要求箱子移动步骤最小。如图:T为目标地,B为箱子,S为推箱子的人,要求将B推到T,步骤最少。



[输入输出]:




[解题分析]:
题解:双重bfs,先对箱子bfs,然后判断这种bfs是否可达(对人bfs)

下面是AC过的代码:
import java.util.*;
import java.io.*;
 public class Main{
  int r;//地图行数
  int c;//地图列数
  int begx, begy;//箱子开始坐标
  int endx, endy;//目标坐标
  int begsx, begsy;//人开始坐标
  char map[][];//地图
  int[] dx ={-1, 1, 0, 0};//人和箱子都有四个方向可移动
  int[] dy ={0, 0, 1, -1};
  char[] P ={'N', 'S', 'E', 'W'};//表示箱子向某个方向移动
  char[] M ={'n', 's', 'e', 'w'};//表示人向某个方向移动
  Node f=new Node(0,0,0,0,"");
  Node g=new Node(0,0,0,0,"");
  node1 F=new node1(0,0,"");
  node1 G=new node1(0,0,"");
  int mark[][];//标志数组,表示地图上某一位置mark[i][j]是否访问过。
  
 
   public Main(char[][] map,int r,int c,int begx,int begy,int endx,int endy,int begsx,int begsy){
     this.map=map;
     this.r=r;
     this.c=c;
     this.begx=begx;
     this.begy=begy;
     this.endx=endx;
     this.endy=endy;
     this.begsx=begsx;
     this.begsy=begsy;
      mark=new int[r][c];   
     }
 
  
 public boolean  ok(int x,int  y) {
    if (x >= 0 && x < r && y >= 0 && y < c) return true;
    return false;
  }

  public boolean SToB(int bx,int by,int ex, int ey) {//人到箱子BFS
 
    int[][] Mark1= new int[r][c];   //标志数组,表示地图上某一位置Mark1[i][j]是否访问过。
    
    Queue<node1> P = new LinkedList<node1>();  
    Mark1[bx][by] = 1;
    Mark1[f.bx][f.by] = 1;
    F.x = bx; F.y = by;
    F.ans = "";
    if (bx == ex && by == ey) return true;//到达目标
    P.offer(new node1(F.x,F.y,F.ans));
    while (!P.isEmpty()) {
        F = P.poll();
        for (int i = 0; i < 4; ++i) {//向四个方向扩展
            G.x = F.x + dx[i];
            G.y = F.y + dy[i];
            if (!ok(G.x, G.y) || map[G.x][G.y] == '#') continue;
            if (Mark1[G.x][G.y]==0) {//此点没有访问过
              
                Mark1[G.x][G.y] = 1;//标记为已访问
                G.ans = F.ans + M[i];
                if (G.x == ex && G.y == ey) {
                    F = G;
                    return true;
                }
                P.add(new node1(G.x,G.y,G.ans));
                
            }
        }
    }
    return false;
 }
 
 public boolean  bfs() {//箱子向目标bfs
    Queue<Node> Q = new LinkedList<Node>();  
    f.bx = begx; f.by = begy;//f:人与箱子所在的位置
    f.px = begsx; f.py = begsy;
    f.ans = "";
    mark[begx][begy] = 1;
    Q.offer(new Node(f.bx,f.by,f.px,f.py,f.ans));
    while (!Q.isEmpty()) {
      f = Q.poll();//出队列
      for (int i = 0; i < 4; ++i) {//检查f的所有邻接点,向四个方向扩展
         int newx = f.bx + dx[i];
         int  newy = f.by + dy[i];//箱子前一位置
         int  tx = f.bx - dx[i];
         int  ty = f.by - dy[i];//箱子后一位置
         if (!ok(newx, newy) || map[newx][newy] == '#' || !ok(tx, ty) 
		      || map[tx][ty] == '#' || mark[newx][newy]==1) continue;
           if (SToB(f.px, f.py, tx, ty)) {//检查人能否来
             g.bx = newx; g.by = newy;
             g.px = f.bx; g.py = f.by;
             g.ans = f.ans + F.ans + P[i];
             if (g.bx == endx && g.by == endy) 
             {
               return true;
              }
              mark[newx][newy] = 1;
              Q.add(new Node(g.bx,g.by,g.px,g.py,g.ans));    
            }
      }
   }
    return false;
 }

 
public static void main(String args[]) {   
    Scanner in=new Scanner(System.in);
    int r=0;
    int c=0;
    String s="";
    int begx=0;
    int begy=0;
    int endx=0;
    int endy=0;
    int begsx=0;
    int begsy=0;
    char[][] map=null;
    int t=1;
    while(in.hasNext()){
      r=in.nextInt();
      c=in.nextInt();
      if(r==0&&c==0) break;
      map=new char[r][c];
      for(int i = 0; i <r; i++){
         s=in.next();
         for(int j=0;j< c;j++){
            map[i][j]=s.charAt(j);
           if (map[i][j] == 'B') { begx = i; begy = j;}//箱子开始坐标
           if (map[i][j] == 'T') { endx = i; endy = j;}//目标坐标
           if (map[i][j] == 'S')  { begsx = i;begsy = j;}//人开始坐标
         }

      }
      Main ma=new Main(map,r,c,begx,begy,endx,endy,begsx,begsy);
       if (ma.bfs()) {
              System.out.println("Maze #"+t++);
              System.out.println(ma.g.ans);
              System.out.println();
        }
        else{ 
          System.out.println("Maze #"+t++);
          System.out.println("Impossible."); 
           System.out.println();
   
        }
  
   }
 }

  }

class node1{
    int x;
    int y;
    String ans;
   public node1(int x,int y,String ans){
    this.x=x;
    this.y=y;
    this.ans=ans;
 }
}

 class Node{
    int bx;
    int by;
    int px;
    int py;
    String ans;
   public Node(int bx,int by,int px,int py,String ans) {
    this.bx=bx;
    this.by=by;
    this.px=px;
    this.py=py;
    this.ans=ans;
 } 
}

  • 大小: 13.2 KB
  • 大小: 23.1 KB
  • 大小: 51.5 KB
  • 大小: 45.7 KB
0
1
分享到:
评论
1 楼 hlstudio 2014-05-06  
好久没见到sokuban了,这有个java版的,带源码,可以参考下 http://sourceforge.net/projects/mywork/

相关推荐

    推箱子源码(java)

    推箱子游戏,源自经典的逻辑益智游戏,以其简单的规则和深度的策略性在全球范围内广受欢迎。这个源码是用Java编程语言实现的,包括声音效果和50个不同难度等级的地图,为学习者提供了一个很好的实践平台,了解游戏...

    java小游戏 推箱子 java小游戏 推箱子

    java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推...

    一个推箱子游戏,由java编写.zip

    一个推箱子游戏,由java编写一个推箱子游戏,由java编写一个推箱子游戏,由java编写 一个推箱子游戏,由java编写一个推箱子游戏,由java编写一个推箱子游戏,由java编写 一个推箱子游戏,由java编写一个推箱子游戏,...

    推箱子Java代码

    自己写的推箱子代码,可以下载下来借鉴学习。学Java的时候可以跟着写一遍。

    PP.rar_java推箱子_推箱子 java_推箱子JAVA

    【标题】"PP.rar_java推箱子_推箱子 java_推箱子JAVA" 提供的信息表明,这是一个基于Java编程语言实现的推箱子游戏。推箱子游戏,也称为 Sokoban,是一种经典的逻辑益智游戏,玩家需要在二维网格环境中移动一个角色...

    java编写的推箱子游戏.zip

    java编写的推箱子游戏.zipjava编写的推箱子游戏.zipjava编写的推箱子游戏.zip java编写的推箱子游戏.zipjava编写的推箱子游戏.zipjava编写的推箱子游戏.zip java编写的推箱子游戏.zipjava编写的推箱子游戏.zipjava...

    推箱子java代码

    在这个Java实现的推箱子游戏中,开发者不仅复刻了经典玩法,还增加了一些额外的功能和全新的视觉体验。 在Java编程语言中开发推箱子游戏,通常会涉及到以下几个关键技术点: 1. **图形用户界面(GUI)**:游戏界面...

    java小游戏 (源码+视频+文档+ppt) swing推箱子游戏

    java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 ...

    java推箱子实验报告.pdf

    这份文档是关于Java推箱子游戏的实验报告,推箱子游戏是一种经典的益智游戏。玩家需要通过推动箱子到指定位置来完成关卡。以下是从文档中提取出的详细知识点: 1. Java编程语言基础:文档提到了“Java”和“JAVA”...

    推箱子小游戏+Java语言

    推箱子小游戏是一种经典的逻辑益智游戏,玩家需要在限定的步数内将箱子推到指定的位置。这个项目是用Java编程语言实现的,展现了Java在游戏开发领域的应用能力。Java作为一种面向对象的语言,具有跨平台、稳定性强、...

    Java的推箱子小游戏.zip

    Java的推箱子小游戏.zipJava的推箱子小游戏.zipJava的推箱子小游戏.zip Java的推箱子小游戏.zipJava的推箱子小游戏.zipJava的推箱子小游戏.zip Java的推箱子小游戏.zipJava的推箱子小游戏.zipJava的推箱子小游戏.zip...

    推箱子游戏(Java含源代码)

    总的来说,这个Java推箱子游戏项目涵盖了面向对象编程、文件处理、游戏逻辑实现、用户界面设计等多个IT知识点。对于学习者来说,通过分析和理解源代码,可以提升Java编程技能,了解游戏开发流程,同时也能接触到序列...

    推箱子java代码(简单)

    通过这个简易版的推箱子Java代码,我们可以学习到面向对象编程、事件处理、图形界面设计以及基本的逻辑判断等多个方面的知识。如果你深入研究和理解这段代码,不仅能提升Java编程技能,还能锻炼问题解决和逻辑思考的...

    Java-推箱子.zip

    在"Java-推箱子.zip"这个压缩包中,我们推测包含了一个用Java Swing实现的推箱子小游戏。推箱子游戏是一款经典的逻辑解谜游戏,玩家需要操作一个角色在格子状的地图上移动,将箱子推到特定的位置。 在这个项目中,...

    推箱子java实现源码

    综上所述,这个Java实现的推箱子游戏涉及了面向对象编程、搜索算法、游戏逻辑设计、用户交互、数据结构优化等多个方面的知识点。通过学习和理解这个源码,开发者可以深入掌握Java编程以及如何利用算法解决实际问题。

    JAVA 实现《推箱子》游戏-全部源码

    1、游戏面板生成显示 2、地图生成算法 3、人物移动算法 4、播放背景音乐 5、箱子移动算法 ...6、全部箱子移动到指定位置,才算游戏过关 需要技术指导,写项目程序,等更多服务请加微信xiaoxuzhu01联系博主

    Java推箱子实现源码分享

    Java推箱子游戏是一种基于策略的益智游戏,源自经典的东方文化元素,玩家需要通过移动箱子到达指定位置。在编程领域,实现这样的游戏可以锻炼开发者逻辑思维和问题解决能力。本资源提供了一份用Java语言编写的推箱子...

    用java语言编写的推箱子游戏的源代码

    在本文中,我们将深入探讨如何使用Java编程语言开发一款经典的推箱子(Puzzle Box)游戏。推箱子游戏是一种策略型单人益智游戏,玩家需要操控一个角色在二维网格环境中移动,将箱子推到目标位置。Java作为一种面向...

Global site tag (gtag.js) - Google Analytics