hggh
adadunknown
c_cpp
a year ago
1.5 kB
10
Indexable
#include<iostream>
using namespace std;
int matrix[500][500];
int Sx, Sy, Hx, Hy;
int n;
int cnt;
struct Point {
int x;
int y;
};
int calDistance(Point a, Point b) {
return (a.x > b.x ? a.x - b.x : b.x - a.x) + (a.y > b.y ? a.y - b.y : b.y - a.y);
}
Point p[50];
long long minDistance;
bool visited[1001];
void backTrack(int index, int nPizza, long long sumDis) {
if(sumDis + matrix[index][cnt - 1] > minDistance) {
return;
}
if(nPizza == cnt - 1) {
sumDis += matrix[index][cnt - 1];
if(sumDis < minDistance) {
minDistance = sumDis;
}
return;
}
visited[index] = true;
for(int i = 1; i < cnt - 1; i++) {
if(!visited[i]) {
backTrack(i, nPizza + 1, sumDis + matrix[index][i]);
}
}
visited[index] = false;
}
int main() {
//freopen("Text.txt", "r", stdin);
int testCase;
cin >> testCase;
for(int tc = 1; tc <= testCase; tc++) {
cin >> Sx >> Sy >> Hx >> Hy;
p[0].x = Sx;
p[0].y = Sy;
cin >> n;
int tmpX, tmpY;
int index = 1;
cnt = 2;
for(int i = 0; i < n; i++) {
cin >> tmpX >> tmpY;
cnt++;
p[index].x = tmpX;
p[index].y = tmpY;
index++;
}
p[cnt - 1].x = Hx;
p[cnt - 1].y = Hy;
for(int i = 0; i < cnt; i++) {
for(int j = 0; j < cnt; j++) {
matrix[i][j] = calDistance(p[i], p[j]);
}
}
for(int i = 0; i < cnt; i++) {
visited[i] = false;
}
minDistance = 10000000;
backTrack(0, 1, 0);
cout << "Case #" << tc << " " << minDistance << endl;
}
return 0;
}
Editor is loading...
Leave a Comment