走迷宫------------数据结构
断断续续花了一天时间,一天啊!才遍了这么一个走迷宫! 它可以用来为我下一步继续研究更高层次的搜索做铺垫。
算法是按照数据结构那本书中的,就是一个栈。没别的了! 等等,期间遇到了一个问题。我想调用函数得到多个返回值,查了一下,一般有两种方法。1.用全局变量来处理(我就是这样) 2.用地址做参数(带研究)。
不说了,反正写出来了。160多行,挺费劲儿的。
代码:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
int xd,yd; //全局变量,我所定义的当前坐标,即下一个要探索的方格坐标
struct board //棋盘
{
int p; //方格的性质,0为通路,1为墙 (初始化为1)
int q; //访问痕迹, 1没有走过,走过就标记为2 (初始化为1)
int fang; //该方格四周探索过的方向, 1表示没有探索过,5表示都探索过 (初始化为1)
}board[12][12];
struct stack //栈记录迷宫路径
{
int x[100]; //记录横坐标
int y[100]; //记录纵坐标
int top;
}s;
void initstack(stack &s) //栈初始化
{
s.top=0;
}
void push(int xx,int yy) //将该方格的坐标x1,y1入栈
{
s.top++;
s.x[s.top]=xx;
s.y[s.top]=yy;
}
int pop(stack &s) //出栈,如果返回值是0,则说明没有路了(我现在没有考虑这种情况)
{
if(s.top==0)
return 0;
else
{
s.top--;
}
}
int f_xd(int i,int j) //切换新的位置坐标
{
xd=i;
yd=j;
int k;
if(board[xd][yd].fang==1)
{
k=board[xd][yd].fang++;
xd--;
return k;
}
if(board[xd][yd].fang==2)
{
k=board[xd][yd].fang++;
yd++;
return k;
}
if(board[xd][yd].fang==3)
{
k=board[xd][yd].fang++;
xd++;
return k;
}
if(board[xd][yd].fang==4)
{
k=board[xd][yd].fang++;
yd--;
return k;
}
if(board[xd][yd].fang==5)
{
return 5;
}
}
int main()
{
int i,j,n;
int x2,y2,x3,y3; //x2,y2是起点坐标,x3,y3终点坐标
for(i=0;i<12;i++) //将棋盘初始化
{
for(j=0;j<12;j++)
{
board[i][j].p=1;
board[i][j].q=1;
board[i][j].fang=1;
}
}
//memset(board,1,sizeof(board)); //把棋盘初始化,
initstack(s); //栈初始化
printf("迷宫格局为n*n矩阵(1<n<9)请输入边长n\n");
scanf("%d",&n);
printf("请输入迷宫,由0,1组成。数字间由空格分隔\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&board[i][j].p);
}
} //现在棋盘已经铸造好
printf("您的迷宫如下:\n");
for(i=0;i<=n+1;i++) //输出迷宫
{
for(j=0;j<=n+1;j++)
printf("%d ",board[i][j].p);
printf("\n");
}
printf("请输入起点坐标\n");
scanf("%d%d",&x2,&y2);
printf("请输入终点坐标\n");
scanf("%d%d",&x3,&y3);
xd=x2;
yd=y2;
push(xd,yd); //将起点入栈,并标记
board[xd][yd].q=2; //标记该点已经走过
f_xd(xd,yd); //转换出新的坐标地址
while(s.top!=0)
{
if(board[xd][yd].p==0&&board[xd][yd].q==1) //如果当前位置可通,切没有被走过
{
push(xd,yd); //入栈并标记
board[xd][yd].q=2;
if(xd==x3&&yd==y3) //如果这个位置是出口,则结束
break;
else
f_xd(xd,yd);
}
else
{
if(s.top!=0&&board[s.x[s.top]][s.y[s.top]].fang<5) //如果栈不为空,且栈顶位置有其他方向未经探索
f_xd(s.x[s.top],s.y[s.top]); //寻找新的当前位置
if(s.top!=0&&board[s.x[s.top]][s.y[s.top]].fang==5) //如果栈不为空,但栈顶四周均不可通
{
pop(s); //删去栈顶元素
if(s.top!=0)
{
f_xd(s.x[s.top],s.y[s.top]); //测试新的栈顶原书的位置
}
}
}
}
printf("从起点到终点的路径如下\n\n");
printf("%d %d\n",xd,yd); //问题出在这里 FUCK
for(i=1;i<=s.top;i++)
printf("[%d][%d]-->",s.x[i],s.y[i]);
getch();
return 0;
}