C語言 DSF (尋求迷宮起點到終點的所有路徑)
資料結構:DFS(入門)
資料結構課程剛講過DFS用的還不熟練,但是資料結構太枯燥了,不想練;好巧不巧,CSDN上剛好有人問一道迷宮路徑的問題;哎!瞬間起勁了,雖然啥都不懂,但是就是想寫一下試試;扣了一個小時,不過還好寫出來了,同時參考了《啊哈演算法》第4章 第1節(不撞南牆不回頭—深度優先搜尋)
沒有什麼快樂是水題給不了的,如果有,那就多來幾道;
#include<stdio.h>
#include<string.h>
#define N 1001
struct st{
int x;
int y;
}s[N];//記錄路徑座標的棧
int Map[N][N];//地圖
int step[N][N];//路徑地圖
int flag[N][N];//標記地圖
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//方向 上,右,左,下
int n,m,k=1,num=1;
void input()
{
s[0].x=s[0].y=1;
for(int i=0;i<k;i++)
{
int x=s[i].x;
int y=s[i].y;
step[x][y]=1;//標記路徑
//printf("(%d,%d) ",x,y);
}
printf("%d\n",num++);//輸出路徑編號
for(int i=1;i<=n;i++)//輸出地圖路徑
{
for(int j=1;j<=m;j++)
{
char str1[5]="->";//路徑
char str2[5]="##";//非路徑
if(step[i][j]==1)
printf("%4s",str1);
else
printf("%4s",str2);
}
printf("\n");
}
memset(step,0,sizeof(step));//路徑地圖置0,防止干擾下次輸出
}
void dsf(int x,int y)
{
if(x==n&&y==m)
{//到達終點,輸出
input();
return;
}
int nx,ny;
for(int i=0;i<4;i++)
{
nx=x+next[i][0];
ny=y+next[i][1];
if(nx<=n&&ny<=m)//判斷是否越界,是否可通過
if(flag[nx][ny]==0&&Map[nx][ny]==1)
{
flag[nx][ny]=1;
s[k].x=nx;// 記錄路徑上的座標 (入棧)
s[k++].y=ny;//記錄路徑上的座標 (入棧)
dsf(nx,ny);//前往下一個點
flag[nx][ny]=0;//回溯(走過的路,退回)
k--;//(出棧)
}
}
}
/*
4 5
1 0 0 0 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
*/
int main()
{
memset(Map,0,sizeof(Map));//置0
memset(flag,0,sizeof(flag));
scanf("%d%d",&n,&m);//行 列
for(int i=1;i<=n;i++)//地圖
{
for(int j=1;j<=m;j++)
{
scanf("%d",&Map[i][j]);
}
}
dsf(1,1);//從左上角開始,向右下角走
return 0;
}
/*樣例輸入輸出
4 5
1 0 0 0 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
1
-> ## ## ## ##
-> ## ## ## ##
-> ## ## ## ##
-> -> -> -> ->
2
-> ## ## ## ##
-> ## -> -> ->
-> ## -> ## ->
-> -> -> ## ->
3
-> ## ## ## ##
-> -> -> ## ##
## ## -> ## ##
## ## -> -> ->
4
-> ## ## ## ##
-> -> -> -> ->
## ## ## ## ->
## ## ## ## ->
*/
相關文章
- dfs列印有向圖的起點到終點路徑
- OOM的起點到終點OOM
- 迷宮的最短路徑
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 迷宮可行路徑數
- 基於JavaFX圖形介面演示的迷宮建立與路徑尋找Java
- 回溯法求迷宮問題
- hdu 1728 逃離迷宮 搜尋
- 幾乎無所不能的C++程式語言,網友:確實有點6C++
- [C語言] 浮點型儲存C語言
- C 語言複雜知識點
- C#程式設計求一個圓弧演算法問題,已知圖形的終點起點,和圓弧角度,求程式設計方法解圓弧的半徑和優劣弧C#程式設計演算法
- 細學C++之C++語言的特點C++
- 用C語言找到所有的鞍點~C語言
- 二分搜尋演算法求元素位置(c語言)演算法C語言
- 終於!“30 歲”的 Linux 核心 C 語言將升級到 C11Linux
- 7-12 求迷宮最短通道(整合版)
- C語言程式設計-漢字點陣C語言程式設計
- 演算法學習之旅,終點亦是起點演算法
- 科技進化的終點,與榮耀全場景的起點
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 使用A*演算法解迷宮最短路徑問題演算法
- C++實現迷宮的生成與解決C++
- c語言常用小知識點總結1C語言
- 走迷宮
- 1744 迷宮
- 509迷宮
- XDOJ_288 求一個順尋串的next函式值 C語言描述函式C語言
- C語言求200000以內的自守數C語言
- 基於RL(Q-Learning)的迷宮尋路演算法演算法
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 點到直線的距離,垂足,對稱點,兩點所成的直線方程
- C語言:使用函式計算兩點間的距離C語言函式
- c語言字串與整形,浮點數...相互轉換C語言字串
- 終身程式設計之新起點程式設計
- C程式起點main函式C程式AI函式
- 關於Ruby的語言特點
- Python語言的特點有哪些?Python