日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图Graph--农夫过河问题(BFS/DFS应用)

發布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图Graph--农夫过河问题(BFS/DFS应用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

農夫過河問題:

/*** @description: 農夫過河問題(羊,白菜,狼),一次最多帶一個東西過河,* 農夫不在的情況下羊會吃白菜,狼會吃羊,如何平安過河* @author: michael ming* @date: 2019/6/13 20:06* @modified by: */ #include <iostream> #include <queue> #include <memory.h>#define MaxVertexNum 10 //最多10種情況(頂點) using namespace std; struct vertexType {int farmer;int wolf;int sheep;int vegetable; }; class MGraph_Farmer //鄰接矩陣圖類 { public:vertexType vertex[MaxVertexNum]; //頂點表int edges[MaxVertexNum][MaxVertexNum];//邊的鄰接矩陣int vN, eN; //頂點和邊的數量int visited[MaxVertexNum]; //訪問標志int prev[MaxVertexNum]; //存儲搜索路徑MGraph_Farmer():vN(0),eN(0){memset(visited,0, sizeof(int)*MaxVertexNum);}void clearPrev(){for(int i = 0; i < MaxVertexNum; ++i)prev[i] = -1;}int findPos(int F, int W, int S, int V)//查找頂點在圖中的位置{for(int i = 0; i < vN; ++i)if(vertex[i].farmer == F && vertex[i].wolf == W &&vertex[i].sheep == S && vertex[i].vegetable == V)return i;return -1;}int is_safe(int F, int W, int S, int V)//判斷是否安全{if(F != S && (W == S || S == V))//人和羊不在一起時,狼羊或者羊菜在一起,不安全return 0;return 1;}int is_connected(int i, int j)//判斷狀態之間是否可以轉換{int k = 0;if(vertex[i].wolf != vertex[j].wolf)k++;if(vertex[i].sheep != vertex[j].sheep)k++;if(vertex[i].vegetable != vertex[j].vegetable)k++;if(vertex[i].farmer != vertex[j].farmer && k <= 1)//農夫每次需要過河,只能帶一件東西return 1;return 0;}void creatGraph()//建立圖的存儲矩陣{int i = 0, j, F, W, S, V;for(F = 0; F <= 1; F++)//生成所有安全狀態的頂點for(W = 0; W <= 1; W++)for(S = 0; S <= 1; S++)for(V = 0; V <= 1; V++)if(is_safe(F, W, S, V)){vertex[i].farmer = F;vertex[i].wolf = W;vertex[i].sheep = S;vertex[i].vegetable = V;i++;}vN = i;//安全頂點個數for(i = 0; i < vN; ++i)for(j = 0; j < vN; ++j)if(is_connected(i,j))//i,j兩種狀態可以轉換,他們的邊置1,否則置0{edges[i][j] = edges[j][i] = 1;//無向圖eN++;}elseedges[i][j] = edges[j][i] = 0;//無向圖eN /= 2;}void dfs(int s, int t){memset(visited,0, sizeof(int)*MaxVertexNum);clearPrev();dfs_path(s, t);if(visited[t])printPath(s,t,t);}void dfs_path(int s, int t)//dfs搜索s到t的路徑{int j;visited[s] = true;for(j = 0; j < vN; ++j)if(edges[s][j] == 1 && !visited[j] && !visited[t]){prev[j] = s;//記錄路徑dfs_path(j, t);}}void printPath(int s, int t, int k){if(k != s){printPath(s,t,prev[k]);}cout << endl;cout << "(" << vertex[k].farmer << vertex[k].wolf<< vertex[k].sheep << vertex[k].vegetable << ")";}void bfs(int s, int t)//bfs搜索s到t的路徑{memset(visited,0, sizeof(int)*MaxVertexNum);clearPrev();queue<int> q;q.push(s);visited[s] = true;int j, w;while(!q.empty()){int w = q.front();q.pop();for(j = 0; j < vN; ++j){if(edges[w][j] == 1 && !visited[j]){prev[j] = w;if(j == t){printPath(s,t,j);return;}visited[j] = true;q.push(j);}}}} };int main() {int s, t;MGraph_Farmer farmerCrossRiver;farmerCrossRiver.creatGraph();s = farmerCrossRiver.findPos(0,0,0,0);t = farmerCrossRiver.findPos(1,1,1,1);cout << "dfs搜索:";farmerCrossRiver.dfs(s,t);cout << endl << "bfs搜索:";farmerCrossRiver.bfs(s,t);return 0; }

總結

以上是生活随笔為你收集整理的图Graph--农夫过河问题(BFS/DFS应用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。