今天看了用栈来求解迷宫问题
大概的思路是这样的:
按照从上-->右-->下-->左的方式探路(上:0,右:1,下:2,左:3),如果找到下一条路,就把坐标进栈,并且将找到的路的位置记住(如果是下,则将2保存到栈中)。并且一个方块进栈后就将对应数组的值赋值为-1(迷宫用二维数组存储).用这样的方式求出来的不是最优解。请看代码:
#include "stdio.h"
struct {
int i;
int j;
int di;/*下一个可以走的方位*/
}st[50];
int miGong(int x,int y,int xe,int ye){
int i,j,k,di,find; /*find 用于标记是否有下一条路,di是下一个可走的方位号码,k用于循环输出结果*/
int a[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int top=-1;
find=0;/*表示还没找到可走相邻方块*/
top++;
st[top].i=x;st[top].j=y;
st[top].di=-1;a[1][1]=-1;
while(top>-1){
i=st[top].i;j=st[top].j;di=st[top].di; /*取栈顶元素*/
if(i==xe && j==ye){
printf("the migong list:/n");
for(k=0;k<=top;k++){
printf("(%d,%d)/t",st[k].i,st[k].j);
if((k+1)%5==0){
printf("/n");
}
}
printf("/n");
return 1;
}
find=0;
while(di<4 && find==0){
di++;
switch(di){
case 0:i=st[top].i-1;j=st[top].j;break;
case 1:i=st[top].i;j=st[top].j+1;break;
case 2:i=st[top].i+1;j=st[top].j;break;
case 3:i=st[top].i;j=st[top].j-1;break;
}
if(a[i][j]==0){
find=1;
}
}
if(find==1){
st[top].di=di;
top++;
st[top].i=i;
st[top].j=j;
st[top].di=-1;
printf("i=%d,j=%d/n",st[1].i,st[1].j);
a[i][j]=-1;
}else{
a[st[top].i][st[top].j]=0;
top--;
}
}
return 0;
}
main(){
miGong(1,1,8,8);
getch();
}
#include "stdio.h"
struct {
int i;
int j;
int di;/*下一个可以走的方位*/
}st[50];
int miGong(int x,int y,int xe,int ye){
int i,j,k,di,find; /*find 用于标记是否有下一条路,di是下一个可走的方位号码,k用于循环输出结果*/
int a[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int top=-1;
find=0;/*表示还没找到可走相邻方块*/
top++;
st[top].i=x;st[top].j=y;
st[top].di=-1;a[1][1]=-1;
while(top>-1){
i=st[top].i;j=st[top].j;di=st[top].di; /*取栈顶元素*/
if(i==xe && j==ye){
printf("the migong list:/n");
for(k=0;k<=top;k++){
printf("(%d,%d)/t",st[k].i,st[k].j);
if((k+1)%5==0){
printf("/n");
}
}
printf("/n");
return 1;
}
find=0;
while(di<4 && find==0){
di++;
switch(di){
case 0:i=st[top].i-1;j=st[top].j;break;
case 1:i=st[top].i;j=st[top].j+1;break;
case 2:i=st[top].i+1;j=st[top].j;break;
case 3:i=st[top].i;j=st[top].j-1;break;
}
if(a[i][j]==0){
find=1;
}
}
if(find==1){
st[top].di=di;
top++;
st[top].i=i;
st[top].j=j;
st[top].di=-1;
printf("i=%d,j=%d/n",st[1].i,st[1].j);
a[i][j]=-1;
}else{
a[st[top].i][st[top].j]=0;
top--;
}
}
return 0;
}
main(){
miGong(1,1,8,8);
getch();
}
思考怎么样才能求道最优解。现在又这样大概的一个思路:
1:从迷宫入口的坐标处,一向下探路,如果没有谈到路,就向右探路,如果像右也没有探到路,那么就向上探路,如果向上探路也没有可走的位置了,那么向左探路.按照下,右,上,左的方式探路(要处理回路问题,麻烦啊现在还不知道怎么实现)。感觉能求求到最优解(个人见解,目前还没有实现出来,明天继续实现这种方式!希望能和预想的一样!O(∩_∩)O~)希望大家多多指导指导!谢谢!。