#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 10
#define N 10
//typedef int ElemType;
typedef struct PosType{
int x;//行号
int y;//列号
}PosType;
typedef struct ElemType{
PosType seat;//通道的坐标
int dirction;//下一个通道在当前通道的位置
}ElenType;
typedef struct SqStack{
ElemType data;
struct SqStack *next;
}SqStack;
typedef SqStack *LinkStack;
//初始化
int InsiStack(LinkStack &s)
{
s = NULL;
return 1;
}
//入栈
int Push(LinkStack &s,ElemType e)
{
LinkStack p;
p = (LinkStack)malloc(sizeof(SqStack));
if(!p)
{
return 0;
}
p -> data = e;
p -> next = s;
s = p;
return 1;
}
//出栈
int Pop(LinkStack &s,ElemType &e)
{
LinkStack q;
if(s == NULL)
{
return 0;
}
e = s -> data;
q = s;
s = s -> next;
free(q);
return 1;
}
//判断是否为空栈
int StackEmpty(LinkStack s)
{
if(s == NULL)
{
return 1;
}
else
{
return 0;
}
}
//迷宫平面图
static char maze[M][N] = {
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', ' ', ' ', '#', ' ', ' ', ' ', '#', ' ', '#'},
{'#', ' ', ' ', '#', ' ', ' ', ' ', '#', ' ', '#'},
{'#', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', '#'},
{'#', ' ', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', '#', ' ', ' ', ' ', '#', ' ', ' ', '#'},
{'#', ' ', '#', '#', '#', ' ', '#', '#', ' ', '#'},
{'#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
PosType start = {1,1};//入口
PosType end = {8,8};//出口
int pass(PosType curpos)
{
if(maze[curpos.x][curpos.y] == ' ')
{
return 1;
}
else
{
return 0;
}
}
int footPrint(PosType curpos)
{
maze[curpos.x][curpos.y] = '1';//标记
}
PosType nextPrint(PosType curpos,int dirction)
{
switch(dirction)
{
case 1:
curpos.y ++;//向东,列加1
break;
case 2:
curpos.x ++;//向南
break;
case 3:
curpos.y --;
break;
case 4:
curpos.x --;
break;
}
return curpos;
}
int MarkPrint(PosType curpos)
{
maze[curpos.x][curpos.y] = '0';//走过但不能到达出口
}
int mazePath(PosType start,PosType end)
{
LinkStack s;
InsiStack(s);
PosType curpos = start;//设定入口
do{
if(pass(curpos))//当前可以通过
{
footPrint(curpos);//留下足迹
ElemType e;
e.seat = curpos;
e.dirction = 1;
Push(s,e);//入栈
if(curpos.x == end.x && curpos.y == end.y)
{
return 1;
}
curpos = nextPrint(curpos,1);
}
else
{
ElemType e;
Pop(s,e);
while(e.dirction == 4 && !StackEmpty(s))
{
MarkPrint(e.seat);//走过但不能到达出口
Pop(s,e);
}
if(e.dirction < 4)
{
e.dirction ++;
Push(s,e);
curpos = nextPrint(e.seat,e.dirction);
}
}
}while(!StackEmpty(s));
return 0;
}
void mazePrint()//打印迷宫
{
int i,j;
system("color 74");
for(i = 0;i < M;i ++)
{
for(j = 0;j < N;j ++)
{
printf("%c ",maze[i][j]);
//system("color 74");
}
printf("\n");
}
printf("\n");
}
void YouPrint(PosType start,PosType end)//有出口和入口
{
int i,j;
for(i = 0;i < M;i ++)
{
for(j = 0;j < N;j ++)
{
if(start.x == i && j == start.y)
{
printf("A ");
}
else if(end.x == i && end.y == j)
{
printf("B ");
}
else
printf("%c ",maze[i][j]);
//system("color 74");
}
printf("\n");
}
printf("\n");
}
void LuPrint()//打印迷宫里的路
{
int i,j;
for(i = 0;i < M;i ++)
{
for(j = 0;j < N;j ++)
{
if(i == 0 || j == 0 || j == N - 1 || i == M - 1 || maze[i][j] == '1')
{
printf("%c ",maze[i][j]);
}
else
{
printf(" ");
}
}
printf("\n");
}
printf("\n");
}
int YanZhen(char *name,char *pass,char *name1,char *pass1)//密码验证
{
int count = 0;
if(strcmp(name,name1) == 0 && strcmp(pass,pass1) == 0)
{
count = 1;
}
return count;
}
int main()
{
int choice;
char name[50] = "周峰";//初始的用户名
char pass[50] = "12345";//初始密码
char name1[50];
char pass1[50];
printf("****************************************\n");
printf("****************<<<地球人勇闯夺命岛>>>");
printf("****************************************\n");
printf("友情提示:输入入口和出口,看能否走出夺命岛\n");
printf("1,用户注册过\n");
printf("2,没有注册过\n");
printf("3,退出系统\n");
printf("请输入你的选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入你的用户名:");
scanf("%s",name1);
printf("请输入你的密码:");
scanf("%s",pass1);
if(YanZhen(name,pass,name1,pass1) == 1)
{
printf("登陆成功\n");
printf("迷宫生成\n");
mazePrint();
PosType start;
PosType end;
printf("请输入迷宫的入口坐标\n");
scanf("%d %d",&start.x,&start.y);
printf("请输入迷宫的出口坐标\n");
scanf("%d %d",&end.x,&end.y);
printf("输入出口和入口的状态\n");
YouPrint(start,end);
if(mazePath(start,end))
{
printf("存在通路\n");
printf("迷宫的现在的状态:\n");
mazePrint();
printf("迷宫中的路径\n");
LuPrint();
}
else
{
printf("不存在通路");
}
}
break;
case 2:
printf("注册:\n");
printf("请输入你的用户名:");
scanf("%s",name);
printf("请输入你的密码:");
scanf("%s",pass);
printf("注册成功\n");
system("cls");//清屏
printf("****************************************\n");
printf("****************<<<地球人勇闯夺命岛>>>**************\n");
printf("****************************************\n");
printf("友情提示:输入入口和出口,看能否走出夺命岛\n");
printf("登陆\n");
printf("请输入你的用户名:");
scanf("%s",name1);
printf("请输入你的密码:");
scanf("%s",pass1);
if(YanZhen(name,pass,name1,pass1) == 1)
{
printf("登陆成功\n");
printf("迷宫生成\n");
mazePrint();
PosType start;
PosType end;
printf("请输入迷宫的入口坐标\n");
scanf("%d %d",&start.x,&start.y);
printf("请输入迷宫的出口坐标\n");
scanf("%d %d",&end.x,&end.y);
printf("输入出口和入口的状态\n");
YouPrint(start,end);
if(mazePath(start,end))
{
printf("存在通路\n");
printf("迷宫的现在的状态:\n");
mazePrint();
printf("迷宫中的路径\n");
LuPrint();
}
else
{
printf("不存在通路");
}
}
break;
case 3:
printf("欢迎下次使用\n");
exit(0);
break;
}
}
运行截图