hggh
adadunknown
c_cpp
a year ago
1.5 kB
5
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