#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")
}
测试数据,算法复杂度你就自己来写吧,如果你连这都不自己做,那你一定是在应付作业。劝你还是自己运行测试一下吧,免得答辩时老师问你,什么都不知道,那你就悲剧了。祝你好运!!
额,又是课程设计。。。迷宫类算法,用栈,队列来做。不过一般来队列,因为队列能够在较短时间内求出最短路径。
在网上搜下,很多的。。
你的要求很难达到。。。