阻击回溯法
#include <iostream>
#include<stdlib.h>
#include<string>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<unordered_map>
#include<algorithm>
#include<functional>
#include<queue>
using namespace std;
int MinDistance = 99999999;
typedef struct node {
int x;
int y;
}node;
int getManhattan(node left, node right) {
return abs(left.x - right.x) + abs(left.y - right.y);
}
vector<node>workers;
vector<node>bikes;
vector<bool>visited;
void process(int currentWorker,int sumDisstance) {
if (sumDisstance >= MinDistance)
return;
if (currentWorker == workers.size()) {
MinDistance = sumDisstance;
return;
}
else {
for (int i = 0; i < bikes.size(); i++) {
if (!visited[i]) {
visited[i] = true;
process(currentWorker + 1,
sumDisstance +getManhattan(workers[currentWorker], bikes[i]));
//还原
visited[i] = false;
}
}
}
}
//初始化
void init(){
workers.push_back(node{ 0,0 });
workers.push_back(node{ 1,1 });
workers.push_back(node{ 2,0 });
bikes.push_back(node{ 1,0 });
bikes.push_back(node{ 2,2 });
bikes.push_back(node{ 2,1 });
visited.resize(bikes.size());
for (int i = 0; i < bikes.size(); i++)
visited[i] = false;
}
int main() {
init();
process(0, 0);
printf("MinDistance: %d",MinDistance);
system("pause");
return 0;
}