就对你输入的这个来说,出口 5 1的数组值为1 是为障碍物 肯定是通不过了,我的整体思路就是在探索中把不为障碍的进栈,如果最后行不通就把栈顶元素初出栈 入栈是为了保留当前探索路径,出栈是最终这个路径不通,如果你把出口设置成 5 5那肯定是有通路的,你可以把我注释掉的都去掉注释,一步步调试,就会明白了
#include <stdio.h>
#include <stdlib.h>
int nums[25][80];//储存迷宫的数据,0代表可以通过,1代表障碍物
int line, row;// line代表多少列,row 代表多少行
struct node
{
int x;//代表当前节点的x坐标
int y;//y坐标
struct node*next;//指向下个节点
struct node*tail;//指向前一个节点
};
node* insert(node *top, int i, int j)//插入新位置,向前走一步
{
node *n;
n = (node*)malloc(sizeof(node));
n->x = i;
n->y = j;
n->next = NULL;
n->tail = top;
top->next = n;
top = n;
//
nums[j][i] = 1;
//
return top;
}
node* delet( node *top )//出栈,把当前的节点删除掉,向后退一步
{
node * p = top;
top = p->tail;
//top->next = NULL;
free(p);
return top;
}
int move( node *top )//判断每个位置的走向可能,按顺时针搜寻,返回不同的int
{
int i=0;
if( nums[top->y][top->x+1]==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);/****向右****/
}
else if( nums[top->y+1][top->x]==0 )//else if( top->y+1!=top->tail->y && nums[top->x][top->y+1]==0 )
{//如果top的y+1不等于上一步的y,就是说没有往回走循环。还要判断这个方向的nums[][]==0 才能走这条路,这是第二种情况,返回2;
return (i=2);/****向下****/
}
else if( nums[top->y][top->x-1]==0 )//else if( top->x-1!=top->tail->x && nums[top->x-1][top->y]==0 )
{
return (i=3);/****向左****/
}
else if( nums[top->y-1][top->x]==0 )//else 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<25; i++ )//初始化,把周围的当成是1 那就不用判断是否出界了
for( j=0; j<80; j++ )
nums[i][j] = 1;
for( i=1; i<=row; i++ )
for( j=1; j<=line; j++ )
scanf("%d",&nums[i][j]);
printf("输入终点:"); scanf("%d%d",&line, &row);
head = (node*)malloc(sizeof(node));//第一步,在起点,栈的开始
head->next = head->tail = NULL;
head->x = head->y = 1;/////////////////////////////////////////////////
top = head;
while( top->y!= row || top->x!= line)//当没达到终点,循环
{
i = move(top);
switch( i )
{
case 0:
if( top == NULL )
{//如果当前是原点,而且move(top)返回的是0,说明当前没有出路了。其它的返还值对应操作
printf("没路了!\n");
exit(0);
}
else
{
//nums[top->x][top->y] = 1;
top = delet(top);// 如果不是第一个点,出栈
}
break;
case 1://如果这个点符合条件,入栈,把下一个点作为前方探路点(向这个方向走了一步)
top = insert(top, top->x+1, top->y);
break;
case 2:
top = insert(top, top->x, top->y+1);
break;
case 3:
top = insert(top, top->x-1, top->y);
break;
case 4:
top = insert(top, top->x, top->y-1);
break;
}
}
while( top )
{
printf("( %d, %d )\n", top->x, top->y);
top = top->tail;
}
return 0;
}