背景說明:
老鼠走迷宮是遞迴求解的基本問題,我們在二維陣列中用2表示迷宮牆壁,使用1來表示老鼠走過的路徑,求出由入口到出口的路徑。
大**白話文:
有迷宮擋在了你和妹子/帥哥中間,自己看著辦吧。
首先列印個小迷宮看看:
全封閉?no!我們去掉最右邊和最底下的一行,只要這個7*7方陣,外邊包起來主要是看路徑的時候比較清晰。
把左上角的第乙個非牆壁點作為起點,即二維陣列的(1,1)元素作為起點,賦值為0,整個陣列可以定義為:
int maze[9][9] = ,
, ,, ,
, , ,
};
然後我們腦補畫面,乙個小老鼠往下走,他有四個方向可以選擇,上下左右,右邊和下邊是空的,可以移動,移動後又有四個方向可以選擇,做判斷,如果不是牆壁2,則可以移動,以此類推,知道移動到終點(7,7)的位置,列印路徑即可,移動過的地方我們賦值為1,直到走到終點,然後遞迴的過程把上乙個多選位置(即至少有兩個方向可走)到下乙個多選位置的元素全部置回0.下面就是**實現:
void visit(int i,int j)
else if(maze[m][n] == 1)
printf("◇");
else
printf(" ");
}printf("\n");
} }if(maze[i][j+1] == 0) visit(i, j+1);
if(maze[i+1][j] == 0) visit(i+1, j);
if(maze[i][j-1] == 0) visit(i, j-1);
if(maze[i-1][j] == 0) visit(i-1, j);
maze[i][j] = 0;
}
這段**最後的maze[i][j] = 0就是將多選路徑中的元素置為0的語句。這樣列印的結果是這樣的:
附上完整**:
#include #include void visit(int ,int);
int maze[9][9] = ,
, ,, ,
, , ,
};int starti = 1,startj = 1;
int endi = 7,endj = 7;
int main(void)
else
} printf("\n");
} visit(starti,startj);
system("pause");
return 0;
}void visit(int i,int j)
else if(maze[m][n] == 1)
printf("◇");
else
printf(" ");
}printf("\n");
} }if(maze[i][j+1] == 0) visit(i, j+1);
if(maze[i+1][j] == 0) visit(i+1, j);
if(maze[i][j-1] == 0) visit(i, j-1);
if(maze[i-1][j] == 0) visit(i-1, j);
maze[i][j] = 0;
}
但是有些時候我們不希望列印所有的路徑,而只希望列印一條路徑即可,那麼我們修改下**:
int visit2(int i, int j)
visit2的作用就成了找到一條可用路徑即可。下面附上main的**:
int main(void)
if(visit2(starti, startj) == 0)
printf("");
else
printf("\n");
}} return 0;
}
ok! C語言 老鼠走迷宮 深度尋路演算法
這個是學校的課設,剛開始有點頭疼,但是感覺越做越有意思了,於是就有如下 可能相較於大佬還有差距,但是這是我目前所能做的最優的程式了吧!話不多說,說一下 的核心內容吧!迷宮是通過二維陣列構造的,二維組中的數字2代表牆體,0是通路,1是老鼠,3代表糧 void game 走迷宮遊戲,包含時間統計,以及對...
從算法學起C語言 費氏數列
背景說明 fibonacci為1200年代的歐洲數學家,在他的著作中曾經提到 若有乙隻兔子每個月生乙隻小兔子,乙個月後小兔子也開始生產,起初只有乙隻兔子,乙個月後就有兩隻兔子,兩個 月後就有3只兔子,三個月後就有五隻兔子 小兔子開始投入生產 大 白話文 找規律並求函式表示式 1,1,2,3,5,8,...
經典演算法 (六)老鼠走迷宮
問題描述 給定乙個二維陣列,陣列中2表示牆壁,0表示通路,由此陣列可展示為乙個迷宮圖。給定入口位置和出口位置,判斷之間是否存在通路並顯示出走出迷宮的道路。問題解答 實際上是使用回溯演算法求解該問題,就是在上下左右四個方向試探,倘若有路則走一步,在新的位置繼續在四個位置試探,並且對走過的路進行標記,倘...