c语言的迷宫问题

Python09

c语言的迷宫问题,第1张

//寻路_带权重_带障碍_最短_文件地图_不闪------wlfryq------//

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

typedef struct

{

int x

int y

} _PT

_PT pt

int row=0,col=0

//设置CMD窗口光标位置

void setxy(int x, int y)

{

   COORD coord = {x, y}

   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord)

}

//获取当前CMD当前光标所在位置

void getxy()

{

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE)

    COORD coordScreen = {0, 0} //光标位置

    CONSOLE_SCREEN_BUFFER_INFO csbi

    if (GetConsoleScreenBufferInfo(hConsole, &csbi))

    {

     pt.x=csbi.dwCursorPosition.X

     pt.y=csbi.dwCursorPosition.Y

    }

}

typedef struct

{

int x

int y

int type

int v

}PT

PT **s=NULL,stack[50],start,end,c

int pos=0

void prt()

{

int i,j

system("cls")

for(i=0i<rowi++)

{

for(j=0j<colj++)

{

if(s[i][j].type==1)

{

printf("■")

}

else if(i==end.x && j==end.y)

{

printf("★")

}

else if(i==c.x && j==c.y)

{

printf("◎")

}

else

{

printf("  ")

}

}

printf("\n")

}

Sleep(500)

}

void stack_in(PT a)

{

stack[pos++]=a

}

PT stack_out()

{

int i

PT t

t=stack[0]

for(i=0i<pos-1i++)

{

stack[i]=stack[i+1]

}

pos--

return t

}

void fun()

{

PT a

int x,y,v

while(1)

{

if(pos==0)

{

break

}

a=stack_out()

x=a.x

y=a.y

if(x==start.x && y==start.y)

{

break

}

v=s[x][y].v

if(x-1>=0 && s[x-1][y].type==0 && (s[x-1][y].v==-1 || s[x-1][y].v>v+1))

{

s[x-1][y].v=v+1

stack_in(s[x-1][y])

}

if(x+1<=row-1 && s[x+1][y].type==0 && (s[x+1][y].v==-1 || s[x-1][y].v>v+1))

{

s[x+1][y].v=v+1

stack_in(s[x+1][y])

}

if(y-1>=0 && s[x][y-1].type==0 && (s[x][y-1].v==-1 || s[x-1][y].v>v+1))

{

s[x][y-1].v=v+1

stack_in(s[x][y-1])

}

if(y+1<=col-1 && s[x][y+1].type==0 && (s[x][y+1].v==-1 || s[x-1][y].v>v+1))

{

s[x][y+1].v=v+1

stack_in(s[x][y+1])

}

}

}

void go(int x, int y)

{

printf("\n按任意键开始\n")

getchar()

int v

while(1)

{

if(x==end.x && y==end.y)

{

setxy(0,y+2)

printf("end....")

return

}

v=s[x][y].v

if(v==0)

{

return

}

if(x-1>=0 && s[x-1][y].v==v-1)

{

c=s[x-1][y]

setxy(y*2,x)

x=x-1

printf("  ")

setxy(y*2,x)

printf("◎")

Sleep(500)

continue

}

else if(x+1<=row-1 && s[x+1][y].v==v-1)

{

c=s[x+1][y]

setxy(y*2,x)

x++

printf("  ")

setxy(y*2,x)

printf("◎")

Sleep(500)

continue

}

else if(y-1>=0 && s[x][y-1].v==v-1)

{

c=s[x][y-1]

setxy(y*2,x)

y--

printf("  ")

setxy(y*2,x)

printf("◎")

Sleep(500)

continue

}

else if(y+1<=col-1 && s[x][y+1].v==v-1)

{

c=s[x][y+1]

setxy(y*2,x)

y++

printf("  ")

setxy(y*2,x)

printf("◎")

Sleep(500)

continue

}

}

printf("\nreturn go\n")

system("pause")

}

void GetMapFromFile()

{

int i,j,x,y,len

char ch[50]={'\0'}

FILE* fp=fopen("e:\\map1.txt","r")

if(fp==NULL)

{

printf("open file failed.\n")

return

}

x=0

while(!feof(fp))

{

fgets(ch,50,fp)

row++

}

col=strlen(ch)

fseek(fp,0L,SEEK_SET)

while(!feof(fp))

{

fgets(ch,50,fp)

if(s==NULL)

{

len=strlen(ch)

for(i=len-1i>0i--)

{

if(ch[i]!='0' && ch[i]!='1')

{

ch[i]='\0'

}

else

{

break

}

}

len=strlen(ch)

s=(PT**)malloc(sizeof(PT*)*row)

for(j=0j<lenj++)

{

*(s+j)=(PT*)malloc(sizeof(PT)*len)

}

}

y=0

for(i=0i<leni++)

{

s[x][y].type=ch[i]-48

s[x][y].x=x

s[x][y].y=y

s[x][y].v=-1

y++

}

x++

}

start=s[row-2][1]

end=s[row-2][len-2]

fclose(fp)

}

int main()

{

GetMapFromFile()

int i,j

int x,y

x=end.x

y=end.y

s[x][y].v=0

stack_in(end)

fun()

c=start

prt()

go(start.x,start.y)

return 0

}

注释非常详细,希望对你有所帮助。

#include<stdio.h>

#include<stdlib.h>

#define M 15

#define N 15

struct mark //定义迷宫内点的坐标类型

{

int x

int y

}

struct Element //"恋"栈元素,嘿嘿。。

{

int x,y//x行,y列

int d//d下一步的方向

}

typedef struct LStack //链栈

{

Element elem

struct LStack *next

}*PLStack

/*************栈函数****************/

int InitStack(PLStack &S)//构造空栈

{

S=NULL

return 1

}

int StackEmpty(PLStack S)//判断栈是否为空

{

if(S==NULL)

return 1

else

return 0

}

int Push(PLStack &S, Element e)//压入新数据元素

{

PLStack p

p=(PLStack)malloc(sizeof(LStack))

p->elem=e

p->next=S

S=p

return 1

}

int Pop(PLStack &S,Element &e) //栈顶元素出栈

{

PLStack p

if(!StackEmpty(S))

{

e=S->elem

p=S

S=S->next

free(p)

return 1

}

else

return 0

}

/***************求迷宫路径函数***********************/

void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2])

{

int i,j,dint a,b

Element elem,e

PLStack S1, S2

InitStack(S1)

InitStack(S2)

maze[start.x][start.y]=2//入口点作上标记

elem.x=start.x

elem.y=start.y

elem.d=-1//开始为-1

Push(S1,elem)

while(!StackEmpty(S1)) //栈不为空 有路径可走

{

Pop(S1,elem)

i=elem.x

j=elem.y

d=elem.d+1//下一个方向

while(d<4) //试探东南西北各个方向

{

a=i+diradd[d][0]

b=j+diradd[d][1]

if(a==end.x &&b==end.y &&maze[a][b]==0) //如果到了出口

{

elem.x=i

elem.y=j

elem.d=d

Push(S1,elem)

elem.x=a

elem.y=b

elem.d=886//方向输出为-1 判断是否到了出口

Push(S1,elem)

printf("\n0=东 1=南 2=西 3=北 886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n")

while(S1) //逆置序列 并输出迷宫路径序列

{

Pop(S1,e)

Push(S2,e)

}

while(S2)

{

Pop(S2,e)

printf("-->(%d,%d,%d)",e.x,e.y,e.d)

}

return//跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return还是不错滴

}

if(maze[a][b]==0) //找到可以前进的非出口的点

{

maze[a][b]=2//标记走过此点

elem.x=i

elem.y=j

elem.d=d

Push(S1,elem)//当前位置入栈

i=a//下一点转化为当前点

j=b

d=-1

}

d++

}

}

printf("没有找到可以走出此迷宫的路径\n")

}

/*************建立迷宫*******************/

void initmaze(int maze[M][N])

{

int i,j

int m,n//迷宫行,列 [/M]

printf("请输入迷宫的行数 m=")

scanf("%d",&m)

printf("请输入迷宫的列数 n=")

scanf("%d",&n)

printf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n)

for(i=1i<=mi++)

for(j=1j<=nj++)

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

printf("你建立的迷宫为(最外圈为墙)...\n")

for(i=0i<=m+1i++) //加一圈围墙

{

maze[i][0]=1

maze[i][n+1]=1

}

for(j=0j<=n+1j++)

{

maze[0][j]=1

maze[m+1][j]=1

}

for(i=0i<=m+1i++) //输出迷宫

{

for(j=0j<=n+1j++)

printf("%d ",maze[i][j])

printf("\n")

}

}

void main()

{

int sto[M][N]

struct mark start,end//start,end入口和出口的坐标

int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}}//行增量和列增量 方向依次为东西南北 [/M]

initmaze(sto)//建立迷宫

printf("输入入口的横坐标,纵坐标[逗号隔开]\n")

scanf("%d,%d",&start.x,&start.y)

printf("输入出口的横坐标,纵坐标[逗号隔开]\n")

scanf("%d,%d",&end.x,&end.y)

MazePath(start,end,sto,add)//find path

system("PAUSE")

}

测试数据,算法复杂度你就自己来写吧,如果你连这都不自己做,那你一定是在应付作业。劝你还是自己运行测试一下吧,免得答辩时老师问你,什么都不知道,那你就悲剧了。祝你好运!!

额,又是课程设计。。。

迷宫类算法,用栈,队列来做。不过一般来队列,因为队列能够在较短时间内求出最短路径。

在网上搜下,很多的。。

你的要求很难达到。。。