「java迷宫求解」java迷宫小游戏

博主:adminadmin 2023-01-02 19:33:07 685

本篇文章给大家谈谈java迷宫求解,以及java迷宫小游戏对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java迷宫算法问题(用栈实现)有算法简述

import java.io.File;

import java.io.FileNotFoundException;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

import java.util.Scanner;

public class Test {

public static void main(String[] args) throws FileNotFoundException {

Scanner input = new Scanner(new File("Maze2tong.txt"));

int row = 0;

char[][] Mazemap = new char[12][58];

while (input.hasNext()) {

String line = input.nextLine();

for (int column = 0; column = line.length() - 1; column++) {

char c = line.charAt(column);

Mazemap[row][column] = c;

}

row++;

}

for (int i = 0; i  12; i++) {

for (int j = 0; j  58; j++) {

System.out.print(Mazemap[i][j]);

}

System.out.print("\n");

}

LinkedListTwoTupleInteger, Integer trace = new LinkedListTwoTupleInteger, Integer();

System.out.println(maze(Mazemap, trace));

System.out.println(trace);

}

public static boolean maze(char[][] maze,

ListTwoTupleInteger, Integer trace) {

LinkedListTwoTupleInteger, Integer path = new LinkedListTwoTupleInteger, Integer();

HashSetTwoTupleInteger, Integer traverse = new HashSetTwoTupleInteger, Integer();

for (int i = 0; i  maze.length; i++) {

for (int j = 0; j  maze[i].length; j++) {

if (maze[i][j] == 'S') {

path.add(new TwoTupleInteger, Integer(i, j));

}

}

}

while (!path.isEmpty()) {

TwoTupleInteger, Integer temp = path.pop();

if (traverse.contains(temp)) {

continue;

} else if (maze[temp.first][temp.second] == 'F') {

trace.add(temp);

return true;

} else if (!traverse.contains(temp)) {

if (temp.second + 1  maze[temp.first].length

 maze[temp.first][temp.second + 1] != 'W')

path.add(new TwoTupleInteger, Integer(temp.first,

temp.second + 1));

if (temp.second - 1  0

 maze[temp.first][temp.second - 1] != 'W')

path.add(new TwoTupleInteger, Integer(temp.first,

temp.second - 1));

if (temp.first + 1  maze.length

 maze[temp.first + 1][temp.second] != 'W')

path.add(new TwoTupleInteger, Integer(temp.first + 1,

temp.second));

if (temp.first - 1  0

 maze[temp.first - 1][temp.second] != 'W')

path.add(new TwoTupleInteger, Integer(temp.first - 1,

temp.second));

traverse.add(temp);

trace.add(temp);

}

}

trace.clear();

return false;

}

}

class TwoTupleA, B {

public final A first;

public final B second;

public TwoTuple(A a, B b) {

first = a;

second = b;

}

@Override

public int hashCode() {

return first.hashCode() + second.hashCode();

}

@Override

public boolean equals(Object obj) {

if (!(obj instanceof TwoTuple)) {

}

return obj instanceof TwoTuple  first.equals(((TwoTuple) obj).first)

 second.equals(((TwoTuple) obj).second);

}

public String toString() {

return "(" + first + ", " + second + ")";

}

} // /:-

import java.io.File;

import java.io.FileNotFoundException;

import java.util.LinkedList;

import java.util.Scanner;

class MyPoint

{

    public boolean visited=false;

    public int parentRow=-1;

    public int parentColumn=-1;

    public final char content;

    public int x;

    public int y;

    public MyPoint(char c,int x,int y)

    {

     this.content = c;

     this.x = x;

     this.y = y;

    }

}

public class Maze

{

    public static MyPoint[][] getMazeArray(){

Scanner input = null;

MyPoint[][] mazemap = new MyPoint[12][58];

try {

input = new Scanner(new File("Maze2tong.txt"));

int row = 0;

while (input.hasNext()) {

String line = input.nextLine();

for (int column = 0; column = line.length() - 1; column++) {

char c = line.charAt(column);

MyPoint point = new MyPoint(c,row,column);

mazemap[row][column] = point;

}

row++;

}

input.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

return mazemap;

    }

    public static boolean tomRun(MyPoint[][] maze,MyPoint end)

    {

     int x = maze.length;

     int y = maze[0].length;

     LinkedListMyPoint stack=new LinkedListMyPoint();

for (int i = 0; i  maze.length; i++) {

for (int j = 0; j  maze[i].length; j++) {

if (maze[i][j].content == 'S') {

stack.push(maze[i][j]);

maze[i][j].visited=true;

}

}

}

        boolean result=false;

        while(!stack.isEmpty())

        {

            MyPoint t=stack.pop();

           //System.out.println("pop point:"+t.x+" "+t.y+" value:"+maze[t.x][t.y]);

            if(t.content == 'F')

            {

                result=true;

                end.x = t.x;

                end.y = t.y;

                break;

            }

            if(t.x-1  0  maze[t.x-1][t.y].visited==false  maze[t.x-1][t.y].content != 'W')

            {

                stack.push(maze[t.x-1][t.y]);

                maze[t.x-1][t.y].parentRow=t.x;

                maze[t.x-1][t.y].parentColumn=t.y;

                maze[t.x-1][t.y].visited=true;

            }

            if(t.x + 1  x  maze[t.x+1][t.y].visited==false  maze[t.x+1][t.y].content != 'W')

            {

                stack.push(maze[t.x+1][t.y]);

                maze[t.x+1][t.y].parentRow=t.x;

                maze[t.x+1][t.y].parentColumn=t.y;

                maze[t.x+1][t.y].visited=true;

            }

            if(t.y - 1  0  maze[t.x][t.y - 1].visited==false  maze[t.x][t.y-1].content != 'W')

            {

                stack.push(maze[t.x][t.y-1]);

                maze[t.x][t.y-1].parentRow=t.x;

                maze[t.x][t.y-1].parentColumn=t.y;

                maze[t.x][t.y-1].visited=true;

            }

            if( t.y + 1  y  maze[t.x][t.y + 1].visited==false  maze[t.x][t.y+1].content != 'W')

            {

                stack.push(maze[t.x][t.y+1]);

                maze[t.x][t.y+1].parentRow=t.x;

                maze[t.x][t.y+1].parentColumn=t.y;

                maze[t.x][t.y+1].visited=true;

            }

 

        }

        return result;

    }

    public static void show(int x,int y,MyPoint[][] visited)

    {

        if(visited[x][y].parentRow==-1)

        {

            System.out.println("["+x+","+y+"]");

            return;

        }

        show(visited[x][y].parentRow,visited[x][y].parentColumn,visited);

        System.out.println("-"+"["+x+","+y+"]");

    }

    public static void main(String[] args)

    {

     MyPoint[][] maze = getMazeArray();

     MyPoint point = new MyPoint('c',1,1);

        if(tomRun(maze,point))

        {

            System.out.println("逃生路径如下:");

            show(point.x,point.y,maze);

        }

        else

            System.out.println("无法走出迷宫!");

    }

}

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW

WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW

WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW

WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWWWWWWWWWWWWWWWWWWW

WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW

WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW

WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW

WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW

WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW

WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWWFW

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW

WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW

WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW

WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWWWWWWWWWWWWWWWWWWW

WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOOOOOOOOOOOOOOWW

WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW

WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW

WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW

WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW

WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWWFW

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

JAVA数据结构迷宫求解!

#includestdio.h

#includegraphics.h

#includeconio.h

typedef struct{

int x,y;

int dir;

}pos,elem;

typedef struct{

elem* b,* t;

int size;

}stack;

void initstack(stack* s)

{

s-b=(elem*)malloc(50*sizeof(elem));

if(s-b){

s-t=s-b;

s-size=50;

return;

}

exit(0);

}

void push(stack* s,elem* e)

{

*s-t=*e;

s-t++;

}

void pop(stack* s,elem* e)

{

*e=*--s-t;

}

void gettop(stack* s,elem* e)

{

*e=*(s-t-1);

}

void clearstack(stack* s)

{

s-t=s-b;

}

int stackempty(stack* s)

{

return !(s-t-s-b);

}

int destroystack(stack* s)

{

free(s-b);

free(s);

return 1;

}

int mg[10][10]={

{-1,-0,-1,-1,-1,-1,-1,-1,-1,-1},

{-1,-0,-0,-0,-1,-0,-0,-0,-0,-1},

{-1,-0,-1,-0,-1,-0,-1,-1,-0,-1},

{-1,-0,-1,-1,-0,-0,-0,-0,-0,-1},

{-1,-0,-0,-1,-0,-1,-1,-0,-0,-1},

{-1,-0,-0,-0,-0,-0,-1,-0,-0,-1},

{-1,-0,-1,-0,-0,-0,-0,-1,-0,-1},

{-1,-0,-1,-1,-0,-0,-0,-1,-0,-1},

{-1,-0,-0,-0,-1,-0,-0,-1,-0,-0},

{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}

};

void step(stack* s,pos* cur,stack* result);

void savepath(stack* s,pos* cur,stack* result);

void draw(int y,int x);

void step(stack* s,pos* cur,stack* result)

{

if(stackempty(result)||s-t-s-bresult-t-result-b){

for(cur-dir++;cur-dir5;cur-dir++){

setfillstyle(SOLID_FILL,15);

switch(cur-dir){

case 1:

if(!mg[cur-y-1][cur-x]){

mg[cur-y][cur-x]=1;

push(s,cur);

cur-y--;

cur-dir=0;

draw(cur-y,cur-x);

return;

}

break;

case 2:

if(!mg[cur-y][cur-x+1]){

mg[cur-y][cur-x]=1;

push(s,cur);

cur-x++;

cur-dir=0;

draw(cur-y,cur-x);

return;

}

break;

case 3:

if(!mg[cur-y+1][cur-x]){

mg[cur-y][cur-x]=1;

push(s,cur);

cur-y++;

cur-dir=0;

draw(cur-y,cur-x);

return;

}

break;

case 4:

if(!mg[cur-y][cur-x-1]){

mg[cur-y][cur-x]=1;

push(s,cur);

cur-x--;

cur-dir=0;

draw(cur-y,cur-x);

return;

}

break;

default:

exit(0);

}

}

}

mg[cur-y][cur-x]=0;

setfillstyle(SOLID_FILL,0);

draw(cur-y,cur-x);

pop(s,cur);

}

void savepath(stack* s,pos* cur,stack* result)

{

pos* top=s-t;

if(stackempty(result)){

push(result,cur);

while(tops-b)

push(result,--top);

}

else if(result-t-result-bs-t-s-b){

clearstack(result);

push(result,cur);

while(tops-b)

push(result,--top);

}

}

void draw(int y,int x)

{

bar(100+15*x,100+15*y,115+15*x,115+15*y);

}

void main(void)

{

int i;

int x,y;

int gd=DETECT,gm;

stack* s=NULL;

stack* result=NULL;

pos* cur=NULL;

initgraph(gd,gm,"");

for(x=0;x10;x++)

for(y=0;y10;y++){

if(mg[y][x]){

setfillstyle(SOLID_FILL,3);

draw(y,x);

}

}

result=(stack*)malloc(sizeof(stack));

initstack(result);

s=(stack*)malloc(sizeof(stack));

cur=(pos*)malloc(sizeof(pos));

initstack(s);

cur-x=1;

cur-y=0;

cur-dir=0;

push(s,cur);

cur-x=1;

cur-y=1;

cur-dir=1;

do{

if(cur-x==9cur-y==8)

savepath(s,cur,result);

step(s,cur,result);

}while(!stackempty(s));

if(stackempty(result))

printf("no way available");

else{

int ch=0;

printf("following is the shortest path:\n");

while(!stackempty(result)){

pop(result,cur);

setfillstyle(SOLID_FILL,15);

draw(cur-y,cur-x);

if(ch5){

putchar('\n');

ch=0;

}

printf("(%d,%d,%d) ",cur-x,cur-y,cur-dir);

ch++;

}

}

printf("\n");

destroystack(s);

destroystack(result);

free(cur);

printf("Press any key to end");

while(!kbhit());

closegraph();

}

java迷宫路径总条数问题

int[][] data是你的迷宫数组,返回值是路径总条数,不需要递归

public int findWayCount(int[][] data) {

int[][] way = new int[data.length][];

for (int m = 0; m data.length; m++) {

way[m] = new int[data[m].length];

for (int n = 0; n data[m].length; n++) {

if (data[m][n] == 0) {

way[m][n] = 0;

} else if (m == 0 n == 0) {

way[m][n] = data[0][0];

} else if (m == 0) {

way[m][n] = way[m][n - 1];

} else if (n == 0) {

way[m][n] = way[m - 1][n];

} else {

way[m][n] = way[m][n - 1] + way[m - 1][n];

}

}

}

请帮忙用数据结构(java版)的知识解决这道迷宫问题的程序代码。

我这是用c写的。你可以看看,希望能帮助到你。

#include"stdlib.h"

#include"stdio.h"

#define N 50

#define M 50

int X;

int maze[N+2][M+2];

struct point{

int row,col,predecessor;

}queue[512];

int head=0,tail=0;

void shoudong_maze(int m,int n){

int i,j;

printf("\n\n");

printf("请按行输入迷宫,0表示通路,1表示障碍:\n\n");

for(i=0;im;i++)

for(j=0;jn;j++)

scanf("%d",maze[i][j]);

}

void zidong_maze(int m,int n){

int i,j;

printf("\n迷宫生成中……\n\n");

system("pause");

for(i=0;im;i++)

for(j=0;jn;j++)

maze[i][j]=rand()%2;

//由于rand()产生的随机数是从0到RAND_MAX

//RAND_MAX是定义在stdlib.h中的,其值至少为32767)

//要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;

}

void print_maze(int m,int n){

int i,j;

printf("\n迷宫生成结果如下:\n\n");

printf("迷宫入口\n");

printf("↓");

for(i=0;im;i++)

{printf("\n");

for(j=0;jn;j++)

{if(maze[i][j]==0) printf("□");

if(maze[i][j]==1) printf("■");}

}

printf("→迷宫出口\n");

}

void result_maze(int m,int n)

{ int i,j;

printf("迷宫通路(用☆表示)如下所示:\n\t");

for(i=0;im;i++)

{ printf("\n");

for(j=0;jn;j++)

{if(maze[i][j]==0||maze[i][j]==2) printf("□");

if(maze[i][j]==1) printf("■");

if(maze[i][j]==3) printf("☆");

}

}

}

void enqueue(struct point p)

{ queue[tail]=p;

tail++;

}

struct point dequeue()

{ head++;

return queue[head-1];

}

int is_empty()

{ return head==tail;

}

void visit(int row,int col,int maze[52][52])

{ struct point visit_point={row,col,head-1};

maze[row][col]=2;

enqueue(visit_point);

}

int mgpath(int maze[52][52],int m,int n)

{ X=1;

struct point p={0,0,-1};

if(maze[p.row][p.col]==1)

{ printf("\n===============================================\n");

printf("此迷宫无解\n\n");X=0;return 0;}

maze[p.row][p.col]=2;

enqueue(p);

while(!is_empty())

{p=dequeue();

if((p.row==m-1)(p.col==n-1)) break;

if((p.col+1n)(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze);

if((p.row+1m)(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze);

if((p.col-1=0)(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze);

if((p.row-1=0)(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze);

}

if(p.row==m-1p.col==n-1)

{printf("\n==================================================================\n");

printf("迷宫路径为:\n");

printf("(%d,%d)\n",p.row,p.col);

maze[p.row][p.col]=3;

while(p.predecessor!=-1)

{p=queue[p.predecessor];

printf("(%d,%d)\n",p.row,p.col);

maze[p.row][p.col]=3;

}

}

else {printf("\n=============================================================\n");

printf("此迷宫无解!\n\n");X=0;}

return 0;

}

int main()

{int i,m,n,cycle=0;

while(cycle!=(-1))

{

printf("********************************************************************************\n");

printf(" ☆欢迎进入迷宫求解系统☆\n");

printf(" 设计者:尹旭 林静波(信息2班)\n");

printf("********************************************************************************\n");

printf(" 手动生成迷宫 请按:1\n");

printf(" 自动生成迷宫 请按:2\n");

printf(" 退出 请按:3\n\n");

printf("********************************************************************************\n");

printf("\n");

printf("请选择你的操作:\n");

scanf("%d",i);

switch(i)

{case 1:printf("\n请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

while((m=0||m50)||(n=0||n50))

{ printf("\n抱歉,你输入的行列数超出预设范围(0-50,0-50),请重新输入:\n\n");

printf("请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

}

shoudong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!=0)

result_maze(m,n);

printf("\n\nPress Enter Contiue!\n");

getchar();

while(getchar()!='\n');

break;

case 2:printf("\n请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

while((m=0||m50)||(n=0||n50))

{printf("\n抱歉,你输入的行列数超出预设范围(0-50,0-50),请重新输入:\n\n");

printf("请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

}

zidong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!=0)

result_maze(m,n);

printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break;

case 3:cycle=(-1);

break;

default:printf("\n");

printf("你的输入有误!\n");

printf("\nPress Enter Contiue!\n");

getchar();

while(getchar()!='\n');break;

}

}

}

JAVA走迷宫问题-怎么使迷宫一定走通?

可以逆向思考,怎么说呢,就是说。

假设现在咱们就在迷宫的出口,那么你往回走(这个往回走,就是随机产生的,可以任意一个方向),最后到达入口,那么这么一个路线就一定可以走的通 呀。。。

求用java语言寻找走出迷宫路线的算法

首先给定一个初始坐标,然后构建一个容器保存坐标值,之后进行迭代,横坐标+1,或者纵坐标+1,这个顺寻自己定义(四个方向),经过的“路径”保存在那个容器中,如果遇到死角,以此往回迭代,在容器中将遇到死角的那个坐标删除。最后找到自己定义的那个迷宫出口坐标。

java迷宫求解的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java迷宫小游戏、java迷宫求解的信息别忘了在本站进行查找喔。