算法:老鼠走迷宮問題(初)
【寫在前面】
老鼠走迷宮問題的遞歸實現,是對遞歸思想的一種應用。
【問題描述】
給定一個二維數組,數組中2表示牆壁,0表示通路,由此數組可展示為一個迷宮圖。給定入口位置和出口位置,判斷之間是否存在通路並顯示出走出迷宮的道路。
【代碼】
對題目的描述部分
int migo[7][7]={ {2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 0, 0, 2, 2}, {2, 2, 0, 2, 0, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 2, 2, 2, 2, 2, 2}};//迷宮圖 int startX=1,startY=1;
int endX=5,endY=5;
說明:
1.給出用來描述迷宮信息的數組。
2.給出入口和出口坐標。
遞歸的實現部分
int flag=0; int find(int x,int y) { migo[x][y]=1; if(x==endX&&y==endY) flag=1; if(migo[x][y+1]==0&&flag!=1) find(x,y+1); if(migo[x][y-1]==0&&flag!=1) find(x,y-1); if(migo[x+1][y]==0&&flag!=1) find(x+1,y); if(migo[x-1][y]==0&&flag!=1) find(x-1,y); if(flag!=1) migo[x][y]=0; return flag; }
說明:
1.第一句代碼 migo[x][y]=1,意義何在呢?我們在開始處把它設為1,表示我們以此為軸開始朝四周移動,每到下一個點便再以之為軸,...不段進行判斷,直達我們找到通路,即flag=1。但是我們需要明白的是,一旦我們沿某條路找不到通路時,最后一句代碼
便又將其還原為0,在對迷宮的所有道路探索后,我們可能會找到通路,那條路上的每一個元素便會被賦予1,如果都沒有,那就不會。
2.關於遞歸的思路:不斷以某點為軸,向四處擴散,在找到出口點便停止遞歸。
道路展示實現部分
int main(int argc, char **argv) { int i,j; printf("顯示迷宮:\n"); for(i=0;i<7;i++) { for(j=0;j<7;j++) if(migo[i][j]==2) printf("█"); else printf(" "); printf("\n"); } if(find(startX,startY)==0) { printf("\n沒有找到出口!\n"); } else { printf("\n顯示路徑:\n"); for(i=0;i<7;i++) { for(j=0;j<7;j++) { if(migo[i][j]==2) printf("█"); else if(migo[i][j]==1) printf("*"); else printf(" "); } printf("\n"); } } return 0; }