Untitled
unknown
plain_text
2 years ago
3.3 kB
4
Indexable
#include<iostream> using namespace std; int N, M, viTri, rowRobot, colRobot, cntVetBan, duLieu[25][25], visited[500]; char map[25][25]; int Qx[5000], Qy[5000], front, rear, vs[25][25], step[25][25]; int dirX[4] = {0, -1, 0, 1}; int dirY[4] = {-1, 0, 1, 0}; int MAXX = 10000000, MIN; bool outOfBoard(int X, int Y) { if (X < 0 || X >= N) return true; if (Y < 0 || Y >= M) return true; return false; } void BFS(int vtX, int vtY, int vt) { for (int i = 0; i < N; i++) { for (int j = 0 ; j < M; j++) { vs[i][j] = 0; step[i][j] = MAXX; } } vs[vtX][vtY] = 1; step[vtX][vtY] = 0; front = 0; rear = 0; Qx[rear] = vtX; Qy[rear] = vtY; rear++; while (front < rear) { int xx = Qx[front]; int yy = Qy[front]; front++; for (int i = 0; i < 4; i++) { int xn = xx + dirX[i]; int yn = yy + dirY[i]; if (!outOfBoard(xn, yn) && vs[xn][yn] == 0 && map[xn][yn] != 'x') { vs[xn][yn] = 1; step[xn][yn] = step[xx][yy] + 1; Qx[rear] = xn; Qy[rear] = yn; rear++; } } } int index = 1; for (int i = 0 ; i < N; i++) { for (int j = 0; j < M; j++) { if (i != vtX || j != vtY) { if (map[i][j] == '*') { if (index == vt) { index++; } duLieu[index][vt] = step[i][j]; duLieu[vt][index] = step[i][j]; index++; } } } } } void backTrack(int row, int numOfSelection, int sum) { if (numOfSelection >= cntVetBan - 1) { if (MIN > sum) { MIN = sum; } return; } for (int i = 0 ; i < cntVetBan; i++) { if (duLieu[row][i] != 0 && visited[i] == 0) { visited[i] = 1; backTrack(i, numOfSelection + 1, sum + duLieu[row][i]); visited[i] = 0; } } } int main() { //freopen("input.txt", "r", stdin); while (true) { cin >> M >> N; if (N == 0 && M == 0) { break; } viTri = 1; cntVetBan = 1; MIN = MAXX; for (int i = 0 ; i < N; i++) { for (int j = 0 ; j < M; j++) { cin>> map[i][j]; duLieu[i][j] = 0; if (map[i][j] == 'o') { rowRobot = i; colRobot = j; } } } BFS(rowRobot, colRobot, 0); for (int i = 0 ; i < N; i++) { for (int j = 0; j < M; j++) { if (map[i][j] == '*') { cntVetBan++; BFS(i, j, viTri); viTri++; } } } for (int i = 0 ; i < cntVetBan; i++) { visited[i] = 0; } visited[0] = 1; backTrack(0, 0, 0); if (MIN == MAXX) { cout << "-1" << endl; } else { cout << MIN << endl; } } return 0; }
Editor is loading...