nyoj 58 最小步數

2021-06-27 15:50:39 字數 1719 閱讀 1496

描述

這有乙個迷宮,有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)分別表示起點的行、列,終點的行、列。

輸出輸出最少走幾步。

樣例輸入

2

3 1 5 7

3 1 6 7

樣例輸出

12

11

深搜入門題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個方向判斷完成後,再從隊首取出乙個元素,接著進行,注意 當隊列為空時,說明搜尋結束仍然沒有找到目標點。這裡的廣搜和樹的層序遍歷極為相似,大家可以先看下樹的層序建立,...