Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <cstdlib>
- #include <climits>
- #include <cstring>
- #include <iomanip>
- #include <limits>
- #include <bitset>
- #include <locale>
- #include <cstdio>
- #include <vector>
- #include <cfloat>
- #include <cmath>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <ctime>
- #include <list>
- #include <map>
- #include <set>
- using namespace std;
- #define fi first
- #define se second
- #define mp make_pair
- #define pb push_back
- #define sz(x) (int) x.size ()
- typedef pair <int, int> ii;
- typedef pair <int, ii> iii;
- typedef vector <int> vi;
- typedef vector <vi> vvi;
- typedef vector <ii> vii;
- typedef vector <vii> vvii;
- int m, n;
- char mat [22][22];
- int d [22][22], c [11][11];
- int dx [] = {-1 ,0, 0, 1};
- int dy [] = {0, -1, 1, 0};
- inline void bfs (const int &x, const int &y)
- {
- memset (d, -1, sizeof d);
- d [x][y] = 0;
- queue <ii> q;
- q.push (mp (x, y));
- while (sz (q))
- {
- ii u = q.front (); q.pop ();
- for (int i = 0; i < 4; ++i)
- {
- ii v (u.fi + dx [i], u.se + dy [i]);
- if (0 <= v.fi && v.fi < m && 0 <= v.se && v.se < n && mat [v.fi][v.se] != 'x' && d [v.fi][v.se] == -1)
- {
- d [v.fi][v.se] = d [u.fi][u.se] + 1;
- q.push (v);
- }
- }
- }
- }
- int dp [1 << 11][11];
- int main ()
- {
- while (scanf ("%d%d", &n, &m), m)
- {
- vii dust;
- int s;
- for (int i = 0; i < m; ++i)
- {
- scanf ("%s", mat [i]);
- for (int j = 0; j < n; ++j)
- if (mat [i][j] == '*' || mat [i][j] == 'o')
- {
- if (mat [i][j] == 'o') s = sz (dust);
- dust.pb (mp (i, j));
- }
- }
- int k = sz (dust);
- bool ok = true;
- for (int i = 0; i < k; ++i)
- for (int j = 0; j < i; ++j)
- {
- bfs (dust [i].fi, dust [i].se);
- if ((c [i][j] = c [j][i] = d [dust [j].fi][dust [j].se]) == -1) ok = false;
- }
- if (ok)
- {
- /*
- for (int i = 0; i < k; ++i)
- {
- for (int j = 0; j < k; ++j)
- printf ("%d ", c [i][j]);
- putchar ('\n');
- }
- */
- int f = (1 << k) - 1;
- for (int i = 1; i <= f; ++i)
- for (int j = 0; j < k; ++j)
- dp [i][j] = 1 << 30;
- dp [1 << s][s] = 0;
- for (int S = 1; S <= f; ++S)
- for (int i = 0; i < k; ++i)
- if (S & (1 << i))
- for (int j = 0; j < k; ++j)
- if (i != j && S & (1 << j))
- dp [S][i] = min (dp [S][i], dp [S - (1 << i)][j] + c [i][j]);
- int res = INT_MAX;
- for (int i = 0; i < k; ++i)
- if (i != s)
- res = min (res, dp [f][i]);
- printf ("%d\n", res);
- }
- else printf ("-1\n");
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment