C演算法 BFS(廣度優先搜尋法)

2021-10-04 08:21:41 字數 4497 閱讀 2627

leetcode490題,迷宮,求到某個點是否存在路徑

leetcode505題,迷宮ii,求到某個點的最小路徑count

leetcode994題,腐爛的橘子,求各自中沒有新鮮橘子經歷的最小分鐘數。

演算法核心就是

1、寫好入隊函式的判斷

2、寫好外面函式入隊的場景

3、二維陣列需要構造結構體包含x,y座標

迷宮我用maze[x][y]==2標識這個區域是否被訪問過

迷宮ii我用maze[x][y]來標識到達當前位置所花的時間

迷宮

#define maxlen 10000

typedef

struct

queue;

queue g_queue[maxlen]

;int

enqueue

(int x,

int y,

int tail,

int*

*maze)

else

return tail +1;

}bool haspath

(int

** maze,

int mazesize,

int* mazecolsize,

int* start,

int startsize,

int* destination,

int destinationsize)

if(start[0]

== destination[0]

&& start[1]

== destination[1]

) row = mazesize;

col =

*mazecolsize;

dx = destination[0]

; dy = destination[1]

; head =0;

tail =0;

g_queue[tail]

.x = start[0]

; g_queue[tail]

.y = start[1]

; maze[g_queue[tail]

.x][g_queue[tail]

.y]=2;

tail++

;int tmpx, tmpy, count;

while

(head < tail)

while

(tmpx -

1>=

0&& maze[tmpx -1]

[tmpy]!=1

) tail =

enqueue

(tmpx, tmpy, tail,maze)

; tmpx = g_queue[head]

.x;while

(tmpx +

1< row && maze[tmpx +1]

[tmpy]!=1

) tail =

enqueue

(tmpx, tmpy, tail,maze)

; tmpx = g_queue[head]

.x;while

(tmpy -

1>=

0&& maze[tmpx]

[tmpy -1]

!=1) tail =

enqueue

(tmpx, tmpy, tail,maze)

; tmpy = g_queue[head]

.y;while

(tmpy +

1< col && maze[tmpx]

[tmpy +1]

!=1) tail =

enqueue

(tmpx, tmpy,tail,maze)

; head++;}

return false;

}

迷宮ii

#define maxlen 10000

typedef

struct

queue;

queue g_queue[maxlen]

;int

enqueue

(int x,

int y,

int count,

int tail,

int*

*maze)

else

//printf("x=%d y=%d count=%d premaze=%d \n", x, y, count, maze[x][y]);

return tail +1;

}int

shortestdistance

(int

** maze,

int mazesize,

int* mazecolsize,

int* start,

int startsize,

int* destination,

int destinationsize)

if(start[0]

== destination[0]

&& start[1]

== destination[1]

) row = mazesize;

col =

*mazecolsize;

dx = destination[0]

; dy = destination[1]

; head =0;

tail =0;

g_queue[tail]

.x = start[0]

; g_queue[tail]

.y = start[1]

; maze[g_queue[tail]

.x][g_queue[tail]

.y]=2;

tail++

;int tmpx, tmpy, count;

while

(head < tail)

tail =

enqueue

(tmpx, tmpy, count, tail, maze)

; tmpx = g_queue[head]

.x; count = maze[tmpx]

[tmpy]

;while

(tmpx +

1< row && maze[tmpx +1]

[tmpy]!=1

) tail =

enqueue

(tmpx, tmpy, count, tail, maze)

; tmpx = g_queue[head]

.x; count = maze[tmpx]

[tmpy]

;while

(tmpy -

1>=

0&& maze[tmpx]

[tmpy -1]

!=1) tail =

enqueue

(tmpx, tmpy, count, tail, maze)

; tmpy = g_queue[head]

.y; count = maze[tmpx]

[tmpy]

;while

(tmpy +

1< col && maze[tmpx]

[tmpy +1]

!=1) tail =

enqueue

(tmpx, tmpy, count, tail, maze)

; head++;}

if(maze[dx]

[dy]==0

)return maze[dx]

[dy]-2

;}

腐爛的橘子

#define maxlen 102

typedef

struct

queue;

queue q[maxlen]

;int

enqueue

(int i,

int j,

int row,

int col,

int*

* grid,

int tail)

if(grid[i]

[j]!=1)

grid[i]

[j]=2;

q[tail]

.x = i;

q[tail]

.y = j;

return tail +1;

}int

orangesrotting

(int

** grid,

int gridsize,

int* gridcolsize)}}

int number, min;

min =0;

while

(head < tail)

if(head < tail)

}for

(i =

0; i < row; i++)}

}return min;

}

BFS 廣度優先搜尋法

bfs的基本思想是 首先訪問初始點v並將其標誌為已經訪問。接著通過鄰接關係將鄰接點入隊。然後每訪問過乙個頂點則出隊。按照順序,訪問每乙個頂點的所有未被訪問過的頂點直到所有的頂點均被訪問過。廣度優先遍歷類似與層次遍歷。其特點是盡可能先對橫向進行搜尋,從指的出發點,按照該點的路徑長度由短到長的順序訪問圖...

演算法 廣度優先搜尋 BFS

廣度優先搜尋主要解決兩類問題 1 從a節點出發,有到b節點的路徑麼?2 從a節點出發,到b節點的最短路徑是什麼?演算法複雜度為o v e 其中v為頂點,e為邊數。例 假設你要在朋友中找乙個芒果銷售商,如果朋友中沒有,則找朋友的朋友,即人際關係網。實現的是第一類問題,在你的人際關係王忠,能找到芒果銷售...

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...