hggh

adad
 avatar
unknown
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