当前位置: 首页 > news >正文

迷宫问题用‘图’求解

迷宫问题能够看做是在“图”中求解:已知的两个节点是否连通,以及求某个连通的通路。能够通过图的深度优先遍历求解。

import java.util.HashSet;
import java.util.Set;
class Pos{
public int i;
public int j;
public Pos(int i,int j){
this.i=i;
this.j=j;
}
public int hashCode(){
return i*100+j;
}
public boolean equals(Object x){
if(x instanceof Pos){
Pos p=(Pos)x;
return p.i==i&&p.j==j;
}
return false;
}
}
@SuppressWarnings("unchecked")
public class Maze {
private char[][] data;
private Pos entry;
private Pos exit;

private Set solve=new HashSet();
private void getStdInput(){
String[] x={
"####B#######",
"####....####",
"####.####..#",
"#....#######",
"#.#####.##.#",
"#.#####.##.#",
"#.##.......#",
"#.##.###.#.#",
"#....###.#.#",
"##.#.###.#.A",
"##.###...###",
"############",

};
data=new char[x.length][];
for(int i=0;i<data.length;i++){
data[i]=x[i].toCharArray();
for(int j=0;j<data[i].length;j++){
if(data[i][j]=='A')entry=new Pos(i,j);
if(data[i][j]=='B')exit=new Pos(i,j);
}
}
}
private void show(){
for(int i=0;i<data.length;i++){

for(int j=0;j<data[i].length;j++){
char c=data[i][j];
if(c=='.'&&solve.contains(new Pos(i,j)))c='x';
System.out.print(c+"");
}
System.out.println();
}
}

private boolean go(Pos cur,Set path){
if(cur.equals(exit))return true;
path.add(cur);
Pos[] t={
new Pos(cur.i,cur.j-1),
new Pos(cur.i,cur.j+1),
new Pos(cur.i-1,cur.j),
new Pos(cur.i+1,cur.j),
};
for(int i=0; i<t.length;i++){
try {
//不是墙壁,且不在路径中的点
if(data[t[i].i][t[i].j]!='#'&&path.contains(t[i])==false)
if(go(t[i],path)){//递归。找到true,即找到终点

solve.add(cur);
return true;//通过邻居已经找到了通路
}
} catch (Exception e) {
//这里用try catch是个小技巧,以防数组下标越界,由于可能某个点不都有上下左右点,一旦异常,默默的过去

}
}
return false;
}
private void go(){
Set path=new HashSet();
solve=new HashSet();
go(entry,path);
}
public static void main(String[] args) {
Maze maze=new Maze();
maze.getStdInput();//获得迷宫的初始状态。包含墙壁。通路,入口,出口等设置
maze.show();//显示当前状态
maze.go();//解决
System.out.println("---------");
maze.show();
}


}

相关文章:

  • jdbcType与javaType的对应关系
  • 从字节码层面看“HelloWorld” (转)
  • java使用嵌套三目表达式进行嵌套HashMap赋值
  • Intervention/image 图片处理扩展包的安装和使用
  • Android Studio项目目录结构介绍
  • mysql-libs与mysql冲突的解决办法
  • [转]EL表达式和JSTL表达式实例
  • IOS中对Url进行编码和解码
  • Uber CEO博鳌论坛采访:看好中国市场共享经济的发展模式
  • linux tmp75 /dev/i2c-* 获取数据 demo
  • 《Thinking in Java》Forth 控制执行流程
  • Android学习笔记-----------广播
  • Ajax跨域访问
  • UILabel和Scrollview结合用,label高度自适应
  • Analytics.js简介
  • (三)从jvm层面了解线程的启动和停止
  • 【React系列】如何构建React应用程序
  • FineReport中如何实现自动滚屏效果
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PAT A1092
  • Redis在Web项目中的应用与实践
  • vue.js框架原理浅析
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 算法---两个栈实现一个队列
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 消息队列系列二(IOT中消息队列的应用)
  • 一个完整Java Web项目背后的密码
  • 正则表达式-基础知识Review
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​比特币大跌的 2 个原因
  • #{}和${}的区别是什么 -- java面试
  • (4) PIVOT 和 UPIVOT 的使用
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十三)Flask之特殊装饰器详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)EOS中账户、钱包和密钥的关系
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 控制台应用程序读取配置文件app.config
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net7 环境安装配置
  • .NET命令行(CLI)常用命令
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .Net中wcf服务生成及调用
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [04]Web前端进阶—JS伪数组
  • [20180129]bash显示path环境变量.txt
  • [bzoj 3124][sdoi 2013 省选] 直径