描述
這有乙個迷宮,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示牆。
現在輸入乙個道路的座標作為起點,再如輸入乙個道路的座標作為終點,問最少走幾步才能從起點到達終點?
(注:一步是指從一座標點走到其上下左右相鄰座標點,如:從(3,1)到(4,1)。)
輸入
第一行輸入乙個整數n(0
隨後n行,每行有四個整數a,b,c,d(0<=a,b,c,d<=8)分別表示起點的行、列,終點的行、列。
輸出輸出最少走幾步。
樣例輸入
23 1 5 7
3 1 6 7
樣例輸出
1211
深搜入門題orz。。。因為迷宮0豎著排得多,所以先下再上再右再左。
檢測過了的,標記為1,四個方向都檢測過,走不通,則恢復為0,再返回上一層。
第一次找到終點後,回到終點前乙個點,繼續向其他方向搜尋。
#include
int c, d, ans, a, b;
void dfs(int m, int n, int step, int vis[9])
//注意二維陣列傳遞方式
if(step >= ans || vis[m][n] == 1)
return;
vis[m][n] = 1;
dfs(m+1, n, step+1, vis);
dfs(m-1, n, step+1, vis);
dfs(m, n+1, step+1, vis);
dfs(m, n-1, step+1, vis);
vis[m][n] = 0;
//一定要回溯,否則沒法第二次第三次的找終點了。無法求出最短路徑。(不回溯交叉路口處本可以找路徑的就不找了) }
int main() ;
ans = 10000;
scanf("%d %d %d %d", &a, &b, &c, &d);
dfs(a, b, 0, vis);
printf("%d\n", ans); }
return 0;
}
廣搜**:
#include
#include
#include
#include
using namespace std;
int step, a, b, c, d, dirx[4] = , diry[4] = ;
typedef struct node
node;
int bfs(int x, int y, int m[9])
} }
return 0; }
int main() ;
scanf("%d %d %d %d", &a,&b,&c,&d);
step = bfs(a, b, m);
printf("%d\n", step);
} }
nyoj 58 最小步數
兩份 都是我寫的,前後隔了很久.還好沒有忘記bfs的基本思路 圖一表示起點,首先起點入隊,佇列中有 x1,y1 while q.empty 這個迴圈中出隊,圖二檢視出隊的這個點 此時是起點 四個方向,如果沒走過就入隊那麼,現在佇列中就有 x2,y2 x3,y3 然後就一次進行上面的操作 最後就搜尋到...
nyoj 58 最小步數
難度 4 描述 這有乙個迷宮,有0 8行和0 8列 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,1,0,0,...
nyoj 58 最小步數(bfs)
初入手搜尋,慢慢來,學演算法不能著急 本題從某一點開始廣搜.就是把上下左右可能的點都遍歷,看看有沒有合適的點,如果有,就放入佇列,然後4個方向判斷完成後,再從隊首取出乙個元素,接著進行,注意 當隊列為空時,說明搜尋結束仍然沒有找到目標點。這裡的廣搜和樹的層序遍歷極為相似,大家可以先看下樹的層序建立,...