Untitled

 avatar
unknown
plain_text
a year ago
3.3 kB
9
Indexable
#include <iostream>
using namespace std;
int T;
int m, n, map[100][100], visit[100][100];
int dirty[100][2], top, xst, yst, numDirty, visitDirty[100], indexCur;
int matrix[100][100], minDis, possible;

int tmpx, tmpy, tx, ty, front, rear, qx[10000], qy[10000];
void initQueue() {
	front = rear = -1;
}
int isEmpty() {
	return front == rear;
}
void enQueue(int x, int y)
{
	qx[++rear] = x;
	qy[rear] = y;
}
void deQueue(int &tmpx, int &tmpy) {
	tmpx = qx[++front];
	tmpy = qy[front];
}
int isValid() {
	return tx >= 0 && tx < n && ty >= 0 && ty < m && map[tx][ty] != 2;
}
void resetVisit() {
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			visit[i][j] = 0;
}

int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int BFS(int x1, int y1, int x2, int y2) {
	int disMin = 1000000;
	int check = 0;
	resetVisit();
	initQueue();
	visit[x1][y1] = 1;
	enQueue(x1, y1);
	while (!isEmpty()) {
		deQueue(tmpx, tmpy);
		if (tmpx == x2 && tmpy == y2) {
			check = 1;
			disMin = visit[tmpx][tmpy] < disMin ? visit[tmpx][tmpy] : disMin;
		}
		for (int k = 0; k < 4; k++) {
			tx = tmpx + dx[k];
			ty = tmpy + dy[k];
			if (isValid()) {
				if (!visit[tx][ty] || (visit[tx][ty] && visit[tmpx][tmpy] + 1 < visit[tx][ty])) {
					visit[tx][ty] = visit[tmpx][tmpy] + 1;
					enQueue(tx, ty);
				}
			}
		}
	}
	if (check)
		return disMin - 1;
	else
		return -1;
}

void backtrack(int x, int y, int numClean, int dist) {
	if (dist > minDis)
		return;
	if (numClean == numDirty) {
		if (dist < minDis)
			minDis = dist;
		return;
	}

	for (int i = 0; i <= numDirty; i++) {
		if (dirty[i][0] == x && dirty[i][1] == y)
			indexCur = i;
	}

	for (int i = 0; i < numDirty; i++) {
		if (!visitDirty[i]) {
			visitDirty[i] = 1;
			backtrack(dirty[i][0], dirty[i][1], numClean + 1, dist + matrix[indexCur][i]);
			visitDirty[i] = 0;
		}
	}
}

int main() {
	cin >> T;
	for (int tc = 1; tc <= T; tc++) {
		top = -1;
		numDirty = 0;
		cin >> n >> m;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cin >> map[i][j];
				if (map[i][j] == 3) {
					xst = i;
					yst = j;
				}
				else if (map[i][j] == 1) {
					dirty[++top][0] = i;
					dirty[top][1] = j;
					numDirty++;
				}
			}
		}
		//Logic
		//Set up matrix ke
		dirty[++top][0] = xst;
		dirty[top][1] = yst;
		possible = 1;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				matrix[i][j] = 0;

		int distance, x1, y1, x2, y2;
		for (int i = 0; i <= numDirty; i++) {
			x1 = dirty[i][0];
			y1 = dirty[i][1];
			for (int j = i + 1; j <= numDirty; j++) {
				x2 = dirty[j][0];
				y2 = dirty[j][1];
				distance = BFS(x1, y1, x2, y2);
				if (distance == -1) possible = 0;
				matrix[i][j] = matrix[j][i] = distance;
				//cout << "X1:" << x1 << " " << "Y1:" << y1 << " " << "X2:" << x2 << " " << "Y2:" << y2 << " " << distance << endl;
			}
		}

		//Backtrack
		//Set up visitDirty
		for (int i = 0; i <= numDirty; i++) {
			visitDirty[i] = 0;
		}
		cout << "Case #"<<tc<<endl;
		if (possible) {
			minDis = 1000000;
			backtrack(xst, yst, 0, 0);
			cout << minDis << endl;
		}
		else {
			cout << -1 << endl;
		}
	}
	
	
	return 0;
}
Editor is loading...
Leave a Comment