生活随笔
收集整理的這篇文章主要介紹了
图Graph--农夫过河问题(BFS/DFS应用)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
農(nóng)夫過河問題:
#include <iostream>
#include <queue>
#include <memory.h>#define MaxVertexNum 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
)){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
){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
){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;
}
總結(jié)
以上是生活随笔為你收集整理的图Graph--农夫过河问题(BFS/DFS应用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。