- 浏览: 603922 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
题目(poj1475):推箱子,要求箱子移动步骤最小。如图:T为目标地,B为箱子,S为推箱子的人,要求将B推到T,步骤最少。
[输入输出]:
[解题分析]:
题解:双重bfs,先对箱子bfs,然后判断这种bfs是否可达(对人bfs)
下面是AC过的代码:
[输入输出]:
[解题分析]:
题解:双重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; } }
评论
1 楼
hlstudio
2014-05-06
好久没见到sokuban了,这有个java版的,带源码,可以参考下 http://sourceforge.net/projects/mywork/
发表评论
-
龙抬头
2014-11-10 15:06 632... -
图的深搜+回溯练习题:POJ2197
2013-01-18 15:53 1676POJ 2197题意: 给定n个城市及其之间的距离,以及距 ... -
田忌赛马: POJ 2287(贪心解法)
2013-01-03 19:24 3061POJ 2287问题描述: 你一定听过田忌赛马的故事吧? ... -
滚动数组应用:POJ 1159
2012-12-29 21:52 1485POJ 1159题意: 回文词是一种对称的字符串。任意给 ... -
POJ2092:计数排序,求第K大的元素
2012-12-27 08:31 1934题目大意: 输入N和M,N就是N次测试,M是说每次测试产生 ... -
直接插入排序练习:POJ 2388
2012-12-26 09:42 1645关于直接插入排序请参看:http://128kj.iteye. ... -
堆排序练习:POJ 2388
2012-12-26 09:27 1875关于堆排序请参看:http://128kj.iteye.com ... -
大(小)顶堆练习:POJ 1442
2012-12-24 20:58 1892POJ1442题意: ADD(a)表示向集合中增加元素a ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1910POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
极角排序:POJ 1696(叉积+深搜)
2012-12-19 16:12 1769POJ1696题意: 一只很 ... -
凸包练习: POJ 2187(JAVA)
2012-12-17 19:31 1662分治化求凸包,请参看:http://128kj.iteye.c ... -
学习凸包(三):凸包练习 POJ 1113
2012-12-16 14:50 2265接上文:学习凸包(二) ... -
二维树状数组练习 POJ 2029
2012-12-13 19:53 1549关于二维树状数组请参 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1398接前文:二维树状数组学习之一:彻底理解http://128kj ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1843关于树状数组:参看:http://128kj.iteye.co ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1842关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1822关于树状数组,请参考:http://128kj.iteye.c ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2121POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
线段树练习POJ 3264
2012-12-03 21:16 1357问题:有n只奶牛排成一列,他们有各自的身高Hi,有Q个区间,分 ... -
在POJ中使用StreamTokenizer从命令行获取输入
2012-12-03 12:21 2157在http://poj.org/上用JAVA解题一般用 ...
相关推荐
推箱子游戏,源自经典的逻辑益智游戏,以其简单的规则和深度的策略性在全球范围内广受欢迎。这个源码是用Java编程语言实现的,包括声音效果和50个不同难度等级的地图,为学习者提供了一个很好的实践平台,了解游戏...
java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推箱子java小游戏 推...
一个推箱子游戏,由java编写一个推箱子游戏,由java编写一个推箱子游戏,由java编写 一个推箱子游戏,由java编写一个推箱子游戏,由java编写一个推箱子游戏,由java编写 一个推箱子游戏,由java编写一个推箱子游戏,...
自己写的推箱子代码,可以下载下来借鉴学习。学Java的时候可以跟着写一遍。
【标题】"PP.rar_java推箱子_推箱子 java_推箱子JAVA" 提供的信息表明,这是一个基于Java编程语言实现的推箱子游戏。推箱子游戏,也称为 Sokoban,是一种经典的逻辑益智游戏,玩家需要在二维网格环境中移动一个角色...
java编写的推箱子游戏.zipjava编写的推箱子游戏.zipjava编写的推箱子游戏.zip java编写的推箱子游戏.zipjava编写的推箱子游戏.zipjava编写的推箱子游戏.zip java编写的推箱子游戏.zipjava编写的推箱子游戏.zipjava...
在这个Java实现的推箱子游戏中,开发者不仅复刻了经典玩法,还增加了一些额外的功能和全新的视觉体验。 在Java编程语言中开发推箱子游戏,通常会涉及到以下几个关键技术点: 1. **图形用户界面(GUI)**:游戏界面...
java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 (源码+视频+文档+ppt) swing推箱子游戏java小游戏 ...
这份文档是关于Java推箱子游戏的实验报告,推箱子游戏是一种经典的益智游戏。玩家需要通过推动箱子到指定位置来完成关卡。以下是从文档中提取出的详细知识点: 1. Java编程语言基础:文档提到了“Java”和“JAVA”...
推箱子小游戏是一种经典的逻辑益智游戏,玩家需要在限定的步数内将箱子推到指定的位置。这个项目是用Java编程语言实现的,展现了Java在游戏开发领域的应用能力。Java作为一种面向对象的语言,具有跨平台、稳定性强、...
Java的推箱子小游戏.zipJava的推箱子小游戏.zipJava的推箱子小游戏.zip Java的推箱子小游戏.zipJava的推箱子小游戏.zipJava的推箱子小游戏.zip Java的推箱子小游戏.zipJava的推箱子小游戏.zipJava的推箱子小游戏.zip...
总的来说,这个Java推箱子游戏项目涵盖了面向对象编程、文件处理、游戏逻辑实现、用户界面设计等多个IT知识点。对于学习者来说,通过分析和理解源代码,可以提升Java编程技能,了解游戏开发流程,同时也能接触到序列...
通过这个简易版的推箱子Java代码,我们可以学习到面向对象编程、事件处理、图形界面设计以及基本的逻辑判断等多个方面的知识。如果你深入研究和理解这段代码,不仅能提升Java编程技能,还能锻炼问题解决和逻辑思考的...
在"Java-推箱子.zip"这个压缩包中,我们推测包含了一个用Java Swing实现的推箱子小游戏。推箱子游戏是一款经典的逻辑解谜游戏,玩家需要操作一个角色在格子状的地图上移动,将箱子推到特定的位置。 在这个项目中,...
综上所述,这个Java实现的推箱子游戏涉及了面向对象编程、搜索算法、游戏逻辑设计、用户交互、数据结构优化等多个方面的知识点。通过学习和理解这个源码,开发者可以深入掌握Java编程以及如何利用算法解决实际问题。
1、游戏面板生成显示 2、地图生成算法 3、人物移动算法 4、播放背景音乐 5、箱子移动算法 ...6、全部箱子移动到指定位置,才算游戏过关 需要技术指导,写项目程序,等更多服务请加微信xiaoxuzhu01联系博主
Java推箱子游戏是一种基于策略的益智游戏,源自经典的东方文化元素,玩家需要通过移动箱子到达指定位置。在编程领域,实现这样的游戏可以锻炼开发者逻辑思维和问题解决能力。本资源提供了一份用Java语言编写的推箱子...
在本文中,我们将深入探讨如何使用Java编程语言开发一款经典的推箱子(Puzzle Box)游戏。推箱子游戏是一种策略型单人益智游戏,玩家需要操控一个角色在二维网格环境中移动,将箱子推到目标位置。Java作为一种面向...