• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我心飛翔

            有事不慌,無(wú)事不荒,有容乃大,無(wú)欲則剛,以德立綱,外圓內(nèi)方。

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              1 隨筆 :: 9 文章 :: 13 評(píng)論 :: 0 Trackbacks

            //base.h
            #include<stdio.h>
            #include<stdlib.h>
            #include<string.h>
            #define OVERFLOW -2
            #define OK 1
            #define ERROR 0
            #define TRUE 1
            #define FALSE 0
            typedef int Status;


            //stack.h
            #define STACK_INIT_SIZE 100 //存儲(chǔ)空間初始量
            #define STACK_INCREMENT 10//存儲(chǔ)空間初始增量
            typedef struct
            {
             int r;
             int c;
            }PostType;//坐標(biāo)位置  迷宮的r行c列
            typedef struct
            {
             int ord;//通道塊在路徑上的序號(hào)
             PostType seat;//通道塊的當(dāng)前坐標(biāo)位置
             int di;//通道塊指向下一通道塊的方向
            }SElemType;//棧元素的類型
            typedef struct
            {
             SElemType *base;//棧底指針
             SElemType *top;//棧頂指針
             int stacksize;//棧的最大容量
            }Stack;//棧的類型

            Status InitStack(Stack &S)//初始化棧
            {
             S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
             if(!S.base)
              exit(OVERFLOW);//存儲(chǔ)分配失敗;
             S.top=S.base;
             S.stacksize=STACK_INIT_SIZE;
             return OK;
            }//InitStack

            Status StackEmpty(Stack S)
            //判斷棧是否為空,如果為空返回TRUE,否則返回FALSE
            {
             if(S.top==S.base)
              return TRUE;
              return FALSE;
            }//StackEmpty

            Status Push(Stack &S,SElemType e)
            //插入元素為e的棧頂元素
            {
             if(S.top-S.base>=S.stacksize)
             {
              S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
                   if(!S.base)
                   exit(OVERFLOW);
                S.top=S.base+S.stacksize;
                S.stacksize+=STACK_INCREMENT;
             }
             *S.top++=e;
             return OK;
            }//Push

            Status Pop(Stack &S,SElemType &e)
            //刪除棧頂元素存入e
            {
             if(S.top==S.base)
              return ERROR;
             e=*--S.top;
             return OK;
            }//Pop

            Status DestroyStack(Stack &S)
            //銷毀棧
            {
             free(S.base);
             S.top=S.base;
             return OK;
            }//DestroyStack


            //maze.cpp
            #define MAXLEN 20//迷宮包括外墻最大行列數(shù)目
            typedef struct{
                     int r;
                     int c;
                     char adr[MAXLEN][MAXLEN];//可取' ''*' '@' '#'
            }MazeType;   //迷宮類型

            Status InitMaze(MazeType &maze){
            //初始化迷宮若成功返回TRUE,否則返回FALSE
                     int m,n,i,j,k=1;
                     printf("輸入迷口的行數(shù)和列數(shù): ");
                     scanf("%d%d",&maze.r,&maze.c); //迷宮行和列數(shù)
                     for(i=0;i<=maze.c+1;i++){//迷宮行外墻
                               maze.adr[0][i]='#';
                               maze.adr[maze.r+1][i]='#';
                     }//for
                     for(i=0;i<=maze.r+1;i++){//迷宮列外墻
                              maze.adr[i][0]='#';
                               maze.adr[i][maze.c+1]='#';
                     }
                     for(i=1;i<=maze.r;i++)
                               for(j=1;j<=maze.c;j++)
                                        maze.adr[i][j]=' ';//初始化迷宮
                     printf("輸入障礙物%d的坐標(biāo)(以坐標(biāo)(0,0)結(jié)束輸入): ",k);
                     scanf("%d%d",&m,&n);//接收障礙的坐標(biāo)
               k++;
                   while(m!=0)
                {
                               if(m>maze.r || n>maze.c)//越界
                                    exit(ERROR);
                               maze.adr[m][n]='#';//迷宮障礙用'#'標(biāo)記
                               printf("輸入障礙物%d的坐標(biāo)(以坐標(biāo)(0,0)結(jié)束輸入): ",k);
                               scanf("%d%d",&m,&n);
                   k++;
                    }
                     return OK;
            }//InitMaze        

            Status Pass(MazeType maze,PostType curpos){
            //當(dāng)前位置可通則返回TURE,否則返回FALSE
                     if(maze.adr[curpos.r][curpos.c]==' ')//可通
                               return TRUE;
                     else
                               return FALSE;
            }//Pass

            Status FootPrint(MazeType &maze,PostType curpos){
            //若走過(guò)并且可通返回TRUE,否則返回FALSE
            //在返回之前銷毀棧S
                     maze.adr[curpos.r][curpos.c]='*';//"*"表示可通
                     return OK;
            }//FootPrint

            PostType NextPos(PostType &curpos,int i){
            //指示并返回下一位置的坐標(biāo)
                     PostType cpos;
                     cpos=curpos;
                     switch(i){        //1.2.3.4分別表示東,南,西,北方向
                               case 1 : cpos.c+=1; break;
                               case 2 : cpos.r+=1; break;
                               case 3 : cpos.c-=1; break;
                               case 4 : cpos.r-=1; break;
                               default: exit(ERROR); 
                     }
                     return cpos;
            }//Nextpos

            Status MarkPrint(MazeType &maze,PostType curpos){
            //曾走過(guò)但不是通路標(biāo)記并返回OK
                     maze.adr[curpos.r][curpos.c]='@';//"@"表示曾走過(guò)但不通
                     return OK;
            }//MarkPrint

            void PrintMaze(MazeType &maze)
            //將最后標(biāo)記好的迷宮輸出
            {
             int i,j;
             printf("\n輸出迷宮的路徑:\n");
             for(i=0;i<=maze.c+1;i++)
              printf("%4d",i);//輸出列數(shù)
             printf("\n");
             for(i=0;i<=maze.r+1;i++)
             {
              printf("%d",i);//輸出行數(shù)
              for(j=0;j<=maze.c+1;j++)
               printf("%4c",maze.adr[i][j]);//輸出迷宮
              printf("\n");
             }
            }//PrintMaze


            Status MazePath(MazeType &maze,PostType start,PostType end)
            //若迷宮從入口start到end的通道則求得一條存放在棧中
            {
             Stack S;//初始化棧
             PostType curpos;
             int curstep;
             SElemType e;
             InitStack(S);
             curpos=start;
             curstep=1;
             do
             {
              if(Pass(maze,curpos))//當(dāng)前位置可通過(guò)而未曾走過(guò)留下足跡
              {
               FootPrint(maze,curpos);
               e.ord=curstep;e.seat=curpos;e.di=1;
               Push(S,e);//加入棧路徑中
                 if(curpos.r==end.r && curpos.c==end.c)//到達(dá)出口返回TRUE
                {
                if(!DestroyStack(S))
                exit(OVERFLOW);
                   else return TRUE;
                }
                 else
                  {
                curpos=NextPos(curpos,1);//下一位置是當(dāng)前位置
                curstep++;//探索下一步
                 }
              }//if
              else//當(dāng)前位置不能通過(guò)
              {
               if(!StackEmpty(S))
               {
                Pop(S,e);//提取前一位置
                while (e.di==4 && !StackEmpty(S))//4個(gè)方向都不能通過(guò)則留下記號(hào)@  提取前一個(gè)位置進(jìn)行判斷是否是能通過(guò)
                {
                 MarkPrint(maze,e.seat);
                 Pop(S,e);
                }
                if(e.di<4)//換下一個(gè)方向探索  設(shè)定當(dāng)前位置為該新方向上的鄰位 
                {
                 e.di++;
                 Push(S,e);
                 curpos=NextPos(e.seat,e.di);
                }
               }//if
              }
             }while(!StackEmpty(S));
             if(!DestroyStack(S))
              exit(ERROR);
             else return FALSE;
            }//MazePath


            void main()
            {
             MazeType maze;
             PostType start,end;
             char c;
             do
             {
              printf("----------找一條迷宮的路徑-------------\n");
              if(!InitMaze(maze))
              {
               printf("\n 初始化迷宮失敗!!!");
               exit(ERROR);
              }
              do
              {
               printf("\n請(qǐng)輸入入口的坐標(biāo):");
                scanf("%d%d",&start.r,&start.c);//輸入入口坐標(biāo)
               if(start.r>maze.r || start.c>maze.c)
                printf("\n輸入錯(cuò)誤,請(qǐng)重新輸入入口的坐標(biāo)!!\n");
               continue;
              }
              while (start.r>maze.r || start.c>maze.c);
              do
              {
               printf("\n請(qǐng)輸入出口的坐標(biāo):");//輸入出口的坐標(biāo)
               scanf("%d%d",&end.r,&end.c);
               if(end.r>maze.r || end.c>maze.c)
                printf("\n輸入錯(cuò)誤,請(qǐng)重新輸入出口坐標(biāo)!!\n");
               continue;
              }
              while (end.r>maze.r || end.c>maze.c);
              if(!MazePath(maze,start,end))
               printf("\n不能找到一條路徑!!!\n");
              else PrintMaze(maze);//輸出迷宮
              printf("是否要繼續(xù)?(y/n):");
              scanf("%s",&c);
             }
             while (c=='y' || c=='Y');
            }//main

            posted on 2005-10-19 20:47 無(wú)情雨 閱讀(1880) 評(píng)論(3)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            評(píng)論

            # re: 迷宮的求解(數(shù)據(jù)結(jié)構(gòu)的棧運(yùn)用) 2006-06-12 17:22 Hking
            不能求解。  回復(fù)  更多評(píng)論
              

            # re: 迷宮的求解(數(shù)據(jù)結(jié)構(gòu)的棧運(yùn)用) 2007-09-25 16:41 zsc
            程序無(wú)語(yǔ)法錯(cuò)誤,但是不能求解!!!!!!  回復(fù)  更多評(píng)論
              

            # re: 迷宮的求解(數(shù)據(jù)結(jié)構(gòu)的棧運(yùn)用) 2008-09-26 09:29 Tina
            在文件頭加上#include "stdafx.h"即可運(yùn)行  回復(fù)  更多評(píng)論
              

            97精品伊人久久大香线蕉| 国产激情久久久久影院| 三级片免费观看久久| 亚洲国产精品热久久| 97久久综合精品久久久综合| 久久久久久国产精品无码下载| 久久综合久久性久99毛片| 久久久久国色AV免费观看| 久久久精品国产Sm最大网站| 久久综合久久伊人| 久久久精品国产免大香伊| 久久亚洲中文字幕精品有坂深雪| 久久久久亚洲av无码专区导航| 72种姿势欧美久久久久大黄蕉| 精品国产福利久久久| 国产精品永久久久久久久久久| 久久最新免费视频| 欧美日韩久久中文字幕| 久久99精品久久久久久动态图| 久久青青草原精品影院| 久久免费视频6| 久久久无码精品亚洲日韩蜜臀浪潮 | 精品久久久久久久| 久久精品18| 99久久国产宗和精品1上映 | 久久性生大片免费观看性| 婷婷久久五月天| 久久青草国产精品一区| 亚洲欧美久久久久9999| 99国产欧美精品久久久蜜芽| 久久亚洲高清综合| 久久99国产综合精品| 国产精品亚洲综合专区片高清久久久| 亚洲日本va午夜中文字幕久久 | 国产2021久久精品| 综合久久给合久久狠狠狠97色| 亚洲午夜久久久久妓女影院| 精品久久久久久久中文字幕| 久久这里只有精品18| 尹人香蕉久久99天天拍| 久久国产成人午夜aⅴ影院|