关于用栈解迷宫的算法
#include "stdafx.h"#include<stdio.h>
#include<stdlib.h>
int nums[100][100];//储存迷宫的数据,0代表可以通过,1代表有障碍物
int line,row;// line代表多少列,row 代表多少行
struct node
{
int x;//代表当前节点的x坐标
int y;//y坐标
struct node*next;//指向下个节点
struct node*tail;//指向前一个节点
};
void insert(node*top,int i,int j)//插入新位置,向前走一步
{
node*n;
n=(node*)malloc(sizeof(node));
n->x=j;
n->y=i;
n->next=NULL;
n->tail=top;
top->next=n;
top=n;
}
void delet(node*top)//出栈,把当前的节点删除掉,向后退一步
{
node*p=top;
top=p->tail;
free(p);
}
int move(node*top)//判断每个位置的走向可能,按顺时针搜寻,返回不同的int
{
int i=0;
if(top->x+1!=top->tail->x&&nums[top->x+1][top->y]==0)//如果top的x+1不等于上一步的x,就是说没有往回走循环。还要判断这个方向的nums[][]==0 才能走这条路,这是第一种情况,返回1;
return (i=1);
if(top->y+1!=top->tail->y&&nums[top->x][top->y+1]==0)//如果top的y+1不等于上一步的y,就是说没有往回走循环。还要判断这个方向的nums[][]==0 才能走这条路,这是第二种情况,返回2;
return (i=2);
if(top->x-1!=top->tail->x&&nums[top->x-1][top->y]==0)
return (i=3);
if(top->y-1!=top->tail->y&&nums[top->x][top->y-1]==0)
return (i=4);
return i;//当上面的假设都不成立就代表四周都不能走了,返回0;
}
int main()
{
int i,j;
node*head,*top;//head只是保留初始点,top才是最远的一个点
printf("请输入一共有多少行?多少列?");
scanf("%d%d",&row,&line);
for(i=0;i<99;i++)//初始化,把周围的当成是1 那就不用判断是否出界了
for(j=0;j<99;j++)
nums[i][j]=1;
for(i=1;i<=row;i++)
for(j=1;j<=line;j++)
scanf("%d",&nums[i][j]);
head=(node*)malloc(sizeof(node));//第一步,在起点,栈的开始
head->next=head->tail=NULL;
head->x=head->y=1;
top=head;
while(top->x!=line||top->y!=row)//当没达到终点,循环
{
switch(move(top))
{
case 0:
if(top->tail==NULL)//如果当前是原点,而且move(top)返回的是0,说明当前没有出路了。其它的返还值对应操作
{
printf("没路了");
exit(0);
}
else
{
nums[top->x][top->y]=1;
delet(top);// 如果不是第一个点,出栈
}
break;
case 1://如果这个点符合条件,入栈,把下一个点作为前方探路点(向这个方向走了一步)
insert(top,top->x+1,top->y);
break;
case 2:
insert(top,top->x,top->y+1);
break;
case 3:
insert(top,top->x-1,top->y);
break;
case 4:
insert(top,top->x,top->y-1);
break;
}
}
return 0;
}
这是自己写的,原理很简单,就是利用栈的特性一步步搜索下去。
我想了很久也没想出哪儿错了,我希望能先找出这个的问题再看更好的方法,希望谁能帮我看看,应该是指针出错了,我指针不懂。
谢谢了。