算法:老鼠走迷宮問題(初)
【寫在前面】
老鼠走迷宮問題的遞歸實現,是對遞歸思想的一種應用。
【問題描述】
給定一個二維數組,數組中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("█");elseprintf(" ");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("*");elseprintf(" ");}printf("\n");}}return 0; }
?