走迷宫
来源:互联网 发布:linux 删除文件夹函数 编辑:程序博客网 时间:2024/05/01 10:33
package com.supermars.practice;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class 走迷宫 {
/*no
1为空地
0为障碍物
input
1 1 0 1 1
1 0 1 1 1
1 0 1 0 0
1 0 1 1 1
1 1 1 0 1
1 1 1 1 1
*/
final static int MAXN = 1 << 7;
static int maze[][] = new int[MAXN][MAXN]; // 迷宫数据
static int vis[][] = new int[MAXN][MAXN]; // 访问标记
static int fa[][] = new int[MAXN][MAXN]; // 父节点编号
static int dist[][] = new int[MAXN][MAXN]; // 最短距离
static int last_dir[][] = new int[MAXN][MAXN]; // 父节点移动方向
static int dir[] = new int[MAXN*MAXN];
static int dx[] = { -1, 1, 0, 0 }, dy[] = { 0, 0, -1, 1 };
static int q[] = new int[MAXN * MAXN];
static int n, m;
public static void main(String[] args) throws FileNotFoundException {
Scanner cin = new Scanner(
new File(
"E:\\jspWorkspace\\programArithmetic\\src\\com\\supermars\\practice\\in.txt"));
int i = 0, j = 0;
while (cin.hasNext()) {
String s = cin.nextLine();
String sa[] = s.split(" ");
j = 0;
while (j < sa.length)
maze[i][j] = Integer.valueOf(sa[j++]);
i++;
}
n = i;
m = j;
i = 0;
j = 0;
bfs(i, j);
//System.out.println("bfs -> print_path");
print_path_1(i,j);
}
private static void print_path(int x, int y) {
int fx=fa[x][y]/m;
int fy=fa[x][y]%m;
if(fx!=x || fy!=y){
print_path(fx,fy);
System.out.print(last_dir[x][y]+" ");
}
}
private static void print_path_1(int x, int y) {
int c=0;
while(true){
int fx=fa[x][y]/m;
int fy=fa[x][y]%m;
if(fx==x && fy==y)break;
dir[c++]=last_dir[x][y];
x=fx;
y=fy;
}
int i=0;
while(i<c){
System.out.print(dir[i++]+" ");
}
}
private static void bfs(int x, int y) {
/*
* coding: u(x,y)=x*m+y vis fa=u dist=0 q[rear++]=u loop(nx,ny-ok->q[rear++]=v vis fa dist
* last_dir)
*/
int front = 0, rear = 0, d, u;
u = x * m + y;
vis[x][y] = 1;fa[x][y] = u;dist[x][y] = 0;
q[rear++] = u; // 放入访问序列
while (front < rear) {
u = q[front++]; // bfs访问首节点
x = u / m;y = u % m; // 首节点的位置(x,y)
for (d = 0; d < 4; d++) { // 节点周边访问
int nx = x + dx[d], ny = y + dy[d]; // 产生新的节点
if (nx >= 0 && nx < n && ny >= 0 && ny < m && (maze[nx][ny] == 1)
&& (vis[nx][ny] == 0)) {
int v=nx*m+ny;
q[rear++]=v; //加入新节点编号到序列
vis[nx][ny]=1;
fa[nx][ny]=u;
dist[nx][ny]=dist[x][y]+1;
last_dir[nx][ny]=d; //方向UDLR=1234
}
}
}
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class 走迷宫 {
/*no
1为空地
0为障碍物
input
1 1 0 1 1
1 0 1 1 1
1 0 1 0 0
1 0 1 1 1
1 1 1 0 1
1 1 1 1 1
*/
final static int MAXN = 1 << 7;
static int maze[][] = new int[MAXN][MAXN]; // 迷宫数据
static int vis[][] = new int[MAXN][MAXN]; // 访问标记
static int fa[][] = new int[MAXN][MAXN]; // 父节点编号
static int dist[][] = new int[MAXN][MAXN]; // 最短距离
static int last_dir[][] = new int[MAXN][MAXN]; // 父节点移动方向
static int dir[] = new int[MAXN*MAXN];
static int dx[] = { -1, 1, 0, 0 }, dy[] = { 0, 0, -1, 1 };
static int q[] = new int[MAXN * MAXN];
static int n, m;
public static void main(String[] args) throws FileNotFoundException {
Scanner cin = new Scanner(
new File(
"E:\\jspWorkspace\\programArithmetic\\src\\com\\supermars\\practice\\in.txt"));
int i = 0, j = 0;
while (cin.hasNext()) {
String s = cin.nextLine();
String sa[] = s.split(" ");
j = 0;
while (j < sa.length)
maze[i][j] = Integer.valueOf(sa[j++]);
i++;
}
n = i;
m = j;
i = 0;
j = 0;
bfs(i, j);
//System.out.println("bfs -> print_path");
print_path_1(i,j);
}
private static void print_path(int x, int y) {
int fx=fa[x][y]/m;
int fy=fa[x][y]%m;
if(fx!=x || fy!=y){
print_path(fx,fy);
System.out.print(last_dir[x][y]+" ");
}
}
private static void print_path_1(int x, int y) {
int c=0;
while(true){
int fx=fa[x][y]/m;
int fy=fa[x][y]%m;
if(fx==x && fy==y)break;
dir[c++]=last_dir[x][y];
x=fx;
y=fy;
}
int i=0;
while(i<c){
System.out.print(dir[i++]+" ");
}
}
private static void bfs(int x, int y) {
/*
* coding: u(x,y)=x*m+y vis fa=u dist=0 q[rear++]=u loop(nx,ny-ok->q[rear++]=v vis fa dist
* last_dir)
*/
int front = 0, rear = 0, d, u;
u = x * m + y;
vis[x][y] = 1;fa[x][y] = u;dist[x][y] = 0;
q[rear++] = u; // 放入访问序列
while (front < rear) {
u = q[front++]; // bfs访问首节点
x = u / m;y = u % m; // 首节点的位置(x,y)
for (d = 0; d < 4; d++) { // 节点周边访问
int nx = x + dx[d], ny = y + dy[d]; // 产生新的节点
if (nx >= 0 && nx < n && ny >= 0 && ny < m && (maze[nx][ny] == 1)
&& (vis[nx][ny] == 0)) {
int v=nx*m+ny;
q[rear++]=v; //加入新节点编号到序列
vis[nx][ny]=1;
fa[nx][ny]=u;
dist[nx][ny]=dist[x][y]+1;
last_dir[nx][ny]=d; //方向UDLR=1234
}
}
}
}
}
0 0
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- unity 默认函数的意思
- Windows内核原理与实现--Windows进程线程基本概念(1)
- scrollview grid 坑爹的经历
- shell程序设计(3)
- 关于UIView的横竖屏自适应
- 走迷宫
- 不同形式的数据插入时间效率问题的测试,如何高效率插入数据
- openstack中安全方面基础知识介绍及keystone的PKI
- OpenGLES 顶点及纹理缓存绑定的目标是在客户机CPU端还是在服务器GPU端 - 有助于真正理解 OpenGLES 各操作的实质
- 如何完成支付宝的支付功能?
- 黑马程序员_学习笔记第14天集合(一)_List、Set
- ACMjava求解最大连续和的三种方法 暴力枚举,S前缀,回溯法
- C++界面库
- 无限级分类之循环家谱树