四人过桥求最短时间
题意:
《算法设计与分析》习题一的第8题
4个人晚上过桥,每次最多两人并行,只有一个手电筒。
4个人过桥的最快时间分别为1,2,5,10(分钟)
先挑两个人过去,再有个人送回来,然后在过两个人…
直到4个人都过去,求最少的总时间
暴力:
写了一晚上,好累
用两个vector模拟桥两边有哪些人
先dfs处理出4选2,3选2的情况
然后在暴力DFS找时间最短的方案
我的代码
/*
Author: xzc
2019/2/26
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
int a[10] = {
0,1,2,5,10};
vector<pair<int,int> >v[5];
void print(pair<int,int>&pr)
{
cout<<"("<<pr.first+1<<","<<pr.second+1<<") ";
}
int r[5];
void dfs(int M,int st,int x) //总人数,当前人数
{
if(x==2)
{
v[M].push_back(make_pair(r[0],r[1]));
return;
}
For(i,st,M-1)
{
r[x] = i;
dfs(M,i+1,x+1);
}
}
int ans;
void init()
{
v[2].push_back(make_pair(0,1));
cout<<"dfs处理出所有4选2,3选2的方案:\n\n";
dfs(4,0,0);
dfs(3,0,0);
For(i,2,4)
{
cout<<i<<"个人里面选两个过河的所有方案为:\n";
for(auto &x:v[i])
print(x);
cout<<endl<<endl;
}
ans = 1e5;
}
vector<int> Left,Right;
vector<int>::iterator it;
vector<int> record;
vector<int> res;
void DFS(bool isLeft,int cost) //当前左边的人数,是在左边还是在右边
{
int num = Left.size();
if(num==0)
{
int cnt = 0;
for(auto &x:record)
{
if(++cnt%3==0) cout<<"过河, ";
cout<<x<<" ";
if