营救公主
来源:互联网 发布:mac版qq怎么远程 编辑:程序博客网 时间:2024/04/20 23:19
题描述 :
公主被魔王抓走了 , 王子需要拯救出美丽的公主 。 他进入了魔王的城
堡 , 魔王的城堡是一座很大的迷宫 。 为了使问题简单化 , 我们假设这个迷宫是一
个 N*M 的二维方格 。 迷宫里有一些墙 , 王子不能通过 。 王子只能移动到相邻 ( 上
下左右四个方向 ) 的方格内 , 并且一秒只能移动一步 , 就是说 , 如果王子在 (x,y )
一步只能移动到 (x-1,y),(x+1,y),(x,y-1),(x,y+1) 其中的一个位置上。地图由
‘S’,‘P’,‘ . ’ , ‘ *’ 四种符号构成 , ‘ . ’ 表示王子可以通过 , ‘ *’ 表示
墙,王子不能通过;'S'表示王子的位置;‘P’表示公主的位置; n表示公主存活的剩余时间,王子必须在 n 秒
内到达公主的位置,才能救活公主。
/**
* 公主被魔王抓走了,王子需要拯救出美丽的公主。他进入了魔王的城堡,魔王的城堡是一座很大的迷宫。
* 为了使问题简单化,我们假设这个迷宫是一个N*M的二维方格。迷宫里有一些墙,王子不能通过。王子只
* 能移动到相邻(上下左右四个方向)的方格内,并且一秒只能移动一步。地图由’S’,’P’,’.’,’*’
* 四种符号构成,’.’表示王子可以通过,’*’表示墙,王子不能通过;’S’表示王子的位置;’P’表示公主
* 的位置;T表示公主存活的剩余时间,王子必须在T秒内到达公主的位置,才能救活公主。如下图所示:
*/
package com;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Set;/** * 公主被魔王抓走了,王子需要拯救出美丽的公主。他进入了魔王的城堡,魔王的城堡是一座很大的迷宫。 * 为了使问题简单化,我们假设这个迷宫是一个N*M的二维方格。迷宫里有一些墙,王子不能通过。王子只 * 能移动到相邻(上下左右四个方向)的方格内,并且一秒只能移动一步。地图由'S','P','.','*' * 四种符号构成,'.'表示王子可以通过,'*'表示墙,王子不能通过;'S'表示王子的位置;'P'表示公主 * 的位置;T表示公主存活的剩余时间,王子必须在T秒内到达公主的位置,才能救活公主。如下图所示: */public class SavePrincess{ private int m; private int n; private char[][] visited; private Map<Position, List<Position>> data = new HashMap<Position, List<Position>>(); private int t; private Position s = null; private Position p = null; public static void main(String[] args) { char maze[][] = { /* 0 1 2 3 4 5 6 7 8 9*/ /* 0 */{ '.', '*', '.', '.', '.', '*', '.', '.', '.', '.' }, /* 1 */{ '.', 'S', '*', '.', '.', '.', '.', '.', '.', '.' }, /* 2 */{ '.', '*', '*', '.', '.', '.', '.', '.', '.', '.' }, /* 3 */{ '.', '.', '*', '*', '*', '.', '.', '.', '.', '.' }, /* 4 */{ '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' }, /* 5 */{ '.', '.', '.', '.', '*', '.', '.', '.', '.', '.' }, /* 6 */{ '.', '.', '.', '.', '*', '.', '.', '.', '.', '.' }, /* 7 */{ '.', '.', '.', '.', '*', '.', '.', '.', '.', '.' }, /* 8 */{ '.', '.', '.', '.', '*', '.', '.', '.', '.', '.' }, /* 9 */{ '.', '.', 'P', '.', '*', '.', '.', '.', '.', '.' } }; // maze[][] = { // /* 0 1 2 3 4 5 6 7 8 9 */ // /* 0 */{ '.', '.', '.', '*', '.', '.', '.', '.', '.', '.' }, // /* 1 */{ '.', 'S', '*', '.', '.', '.', '.', '.', '.', '.' }, // /* 2 */{ '.', '.', '*', '.', '.', '.', '.', '.', '.', '.' }, // /* 3 */{ '.', '.', '*', '*', '.', '*', '.', '.', '.', '.' }, // /* 4 */{ '.', '.', '.', '*', '.', '*', '.', '.', '.', '.' }, // /* 5 */{ '.', '.', '.', '*', '.', '.', '.', '.', '.', '.' }, // /* 6 */{ '.', '.', '*', '.', '.', '.', '.', '.', '.', '.' }, // /* 7 */{ '.', '.', '*', '.', '*', '.', '*', '.', '.', '.' }, // /* 8 */{ '.', '.', '.', '.', '*', '.', '*', '*', '*', '.' }, // /* 9 */{ '.', '.', '*', '.', '*', '.', '*', 'P', '.', '.' } }; new SavePrincess().saved(maze, 10, 8, 11); } /** * @param vis * M行N列迷宫 * @param m * M * @param n * N * @param t * T * * @return boolean true表示营救成功,反之表示失败。 */ public boolean saved(char[][] vis, int m, int n, int t) { this.m = m; this.n = n; this.visited = vis; this.t = t; for (int i = 0; i != m; i++) { for (int j = 0; j != n; j++) { System.out.print(visited[i][j]); System.out.print(' '); Position tmp = new Position(i, j); switch (visited[i][j]) { case '*': break; case 'S': this.s = tmp; break; case '.': prepareNode(i, j, tmp); break; case 'P': this.p = tmp; prepareNode(i, j, tmp); default: break; } } System.out.println(""); } if (s == null || p == null) { System.out.println("input visited error!"); return false; } Set<Position> excudedNode = new HashSet<Position>(); int l = findNearstWay(p, excudedNode); if (l < 0) { System.out.println("failed saved the princess!"); return false; } else { System.out.println("Saved the princess in " + l + " seconds!"); return true; } } private int findNearstWay(Position p2, Set<Position> excudedNode) { if (s.equals(p2)) { return 0; } List<Position> lst = data.get(p2); excudedNode.add(p2); int minLen = -1; if (lst == null) { return minLen; } for (Position o : lst) { if (excudedNode.contains(o)) { continue; } int len = findNearstWay(o, excudedNode); if ((len <= this.t && len != -1) && (minLen == -1 || (minLen != -1 && len < minLen))) { minLen = len; } } excudedNode.remove(p2); if (minLen != -1) { return minLen + 1; } else { return minLen; } } private void prepareNode(int i, int j, Position tmp) { List<Position> lst1 = new LinkedList<Position>(); addOneNode(i + 1, j, lst1); addOneNode(i, j + 1, lst1); addOneNode(i - 1, j, lst1); addOneNode(i, j - 1, lst1); if (!lst1.isEmpty()) { data.put(tmp, lst1); } } private void addOneNode(int i, int j, List<Position> lst) { if (i >= m || i < 0 || j >= n || j < 0) { return; } switch (visited[i][j]) { case '.': case 'S': lst.add(new Position(i, j)); break; default: break; } }}
package com;public class Position implements Comparable<Position>{ private int i; private int j; public Position(int i, int j) { this.i = i; this.j = j; } @Override public int compareTo(Position o) { if (this.i == o.i && this.j == o.j) { return 0; } else if (this.i > o.i) { return 1; } else { if (this.i > o.j) { return 1; } else { return -1; } } } public boolean equals(Object o) { if (!(o instanceof Position)) { return false; } if (this.compareTo((Position) o) == 0) { return true; } return false; } public int hashCode() { int result = 17; result = 31 * result + i; result = 31 * result + j; return result; } public String toString() { return "(" + i + ", " + j + ")"; }}
0 0
- 营救公主
- 营救公主
- OJ题-营救公主
- 【广度优先遍历】营救公主
- 营救公主(华为OJ)
- 营救公主-广度优先遍历算法
- 营救公主的100种方法
- 营救公主(Java实现A*算法解决迷宫问题)
- HDOJ-1242-RESCURE(营救公主)【BFS+优先队列】
- 面试题七 C/C++ 骑士营救公主 骑士只能向右或者向下移动,遇到陷阱就死了,求骑士营救公主的所有路线-程序员面试题
- 营救
- 营救
- 营救
- 这篇有趣的文章编译自一篇西班牙博客。 有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她… 下面是各种语言如何想办法将公主从巨龙手中营救出来的。
- 营救皮卡丘
- 【a803】营救
- P1396 营救
- 2074 营救
- 设计模式--适配器
- parseInt()函数正解
- Stamps uva+回溯
- volatile
- 鼠标滚轮插件jQuery mousewheel
- 营救公主
- 19_leetcode_Remove Duplicates from Sorted Array
- C++运算符重载
- Java并发编程之ConcurrentHashMap
- 20_leetcode_Search in Rotated Sorted Array
- golang text/template的用法: if, else, with
- leetcode——Reverse Words in a String 旋转字符串中单词顺序(AC)
- 再看virtual
- 简单分布式资源调度程度【仅题目】