SOGO論壇
  登入   註冊   找回密碼
查看: 1168|回覆: 2
列印 上一主題 下一主題

[問題求助] c++程式問題 [複製連結]

Rank: 4

狀態︰ 離線
跳轉到指定樓層
1
發表於 2010-11-8 11:10:58 |只看該作者 |倒序瀏覽
有高手能幫我解釋這個程式嗎?


#include <stdio.h>
#include <stdlib.h>
#define EAST  MAZE[x][y+1]  /*定義東方的相對位置*/
#define WEST  MAZE[x][y-1]  /*定義西方的相對位置*/
#define SOUTH MAZE[x+1][y]        /*定義南方的相對位置*/
#define NORTH MAZE[x-1][y]        /*定義北方的相對位置*/
#define ExitX 8                /*定義出口的X座標在第八列*/
#define ExitY 10                /*定義出口的Y座標在第十行*/
struct list
{
        int x,y;
        struct list* next;
};
typedef struct list node;
typedef node* link;
int MAZE[10][12] = {1,1,1,1,1,1,1,1,1,1,1,1,        /*宣告迷宮陣列*/
                  1,0,0,0,1,1,1,1,1,1,1,1,
                  1,1,1,0,1,1,0,0,0,0,1,1,
                  1,1,1,0,1,1,0,1,1,0,1,1,
                  1,1,1,0,0,0,0,1,1,0,1,1,
                  1,1,1,0,1,1,0,1,1,0,1,1,
                  1,1,1,0,1,1,0,1,1,0,1,1,
                  1,1,1,1,1,1,0,1,1,0,1,1,
                  1,1,0,0,0,0,0,0,1,0,0,1,
                  1,1,1,1,1,1,1,1,1,1,1,1};
link push(link stack,int x,int y);
link pop(link stack,int* x,int* y);
int chkExit();
int main()
{
        int i,j,x,y;
        link path = NULL;
        x=1;        /*入口的X座標*/
        y=1;    /*入口的Y座標*/
        printf("[迷宮的路徑(0的部分)]\n"); /*印出迷宮的路徑圖*/
        for(i=0;i<10;i++)
        {
                for(j=0;j<12;j++)
                        printf("%2d",MAZE[j]);
                printf("\n");
        }
while(x<=ExitX&&y<=ExitY)
        {
                MAZE[x][y]=2;
                if(NORTH==0)
                {
                        x -= 1;
                        path=push(path,x,y);
                }
                else if(SOUTH==0)
                {
                        x+=1;
                        path=push(path,x,y);
                }
                else if(WEST==0)
                {
                        y-=1;
                        path=push(path,x,y);
                }
                else if(EAST==0)
                {
                        y+=1;
                        path=push(path,x,y);
                }
                else if(chkExit(x,y,ExitX,ExitY)==1) /*檢查是否走到出口了*/
                        break;
                else
                {
                        MAZE[x][y]=2;
                        path=pop(path,&x,&y);
                }
        }
printf("[老鼠走過的路徑(2的部分)]\n"); /*印出老鼠走完迷宮後的路徑圖*/
        for(i=0;i<10;i++)
        {
                for(j=0;j<12;j++)
                        printf("%2d",MAZE[j]);
                printf("\n");
        }
        system("pause");
        return 0;
}
link push(link stack,int x,int y)
{
        link newnode;
        newnode = (link)malloc(sizeof(node));
        if(!newnode)
        {
                printf("Error!記憶體配置失敗!\n");
                return NULL;
        }
        newnode->x=x;
        newnode->y=y;
        newnode->next=stack;
        stack=newnode;
    return stack;
}
link pop(link stack,int* x,int* y)
{
        link top;
        if(stack!=NULL)
        {
                top=stack;
                stack=stack->next;
                *x=top->x;
                *y=top->y;
                free(top);
                return stack;
        }
        else
                *x=-1;
        return stack;
}
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 5Rank: 5

數位軟體勳章

狀態︰ 離線
2
發表於 2010-11-8 19:30:40 |只看該作者
這在資料結構中,應該是最基礎的題目.只是一般常用都是使用遞迴處理.

這個程式則是不用遞迴,在加上使用Linked-List 連結串列去紀錄老鼠走過得路徑.如果改用遞迴程式碼不超過20行吧
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 1 感謝您熱心幫助會員解決問題,論壇需要您 ...

總評分: 威望 + 1   查看全部評分

Rank: 4

狀態︰ 離線
3
發表於 2010-11-11 00:14:15 |只看該作者
觀念就是走下一步時,要先把目前這步的位置記下來 (push)
如果前面沒路了,就退回上一步(pop),改走另一個方向
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-5-25 08:31

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部