数据结构-迷宫求解

今天看了用栈来求解迷宫问题
大概的思路是这样的:
按照从上-->右-->下-->左的方式探路(上: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();
}
思考怎么样才能求道最优解。现在又这样大概的一个思路:
1:从迷宫入口的坐标处,一向下探路,如果没有谈到路,就向右探路,如果像右也没有探到路,那么就向上探路,如果向上探路也没有可走的位置了,那么向左探路.按照下,右,上,左的方式探路(要处理回路问题,麻烦啊现在还不知道怎么实现)。感觉能求求到最优解(个人见解,目前还没有实现出来,明天继续实现这种方式!希望能和预想的一样!O(∩_∩)O~)希望大家多多指导指导!谢谢!。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值