#include #include #include #include using namespace std; struct Point { Point() {} Point(int xx, int yy) : x(xx), y(yy) {} Point(const Point& p) : x(p.x), y(p.y) {} int x, y; }; int w, h; char field[32][32]; int table[32][32]; Point start; vector dirty; int dn; int dist[10][10]; int dstart[10]; void MakeTable(Point s) { memset(table, -1, sizeof(table)); multimap up; up.insert(make_pair(0, s)); while(!up.empty()) { int d = up.begin()->first; Point p = up.begin()->second; int i = p.x; int j = p.y; up.erase(up.begin()); if(i < 0 || h <= i || j < 0 || w <= j) continue; if(field[i][j] == 'x' || table[i][j] >= 0) continue; //cout << d << i << j << endl; table[i][j] = d; up.insert(make_pair(d+1, Point(i+1,j))); up.insert(make_pair(d+1, Point(i-1,j))); up.insert(make_pair(d+1, Point(i,j+1))); up.insert(make_pair(d+1, Point(i,j-1))); } } int Solve(int state, int from, int to) { if(state == 0) { return dstart[to]; } int next = state & ~(1<> w >> h >> ws && w) { dirty.clear(); for(int i = 0; i < h; ++i) { cin.getline(field[i], 32); for(int j = 0; j < w; ++j) { switch(field[i][j]) { case 'o': start.x = i; start.y = j; break; case '*': dirty.push_back(Point(i,j)); break; }; } } bool unsolve = false; dn = dirty.size(); MakeTable(start); for(int i = 0; i < dn; ++i) { Point p = dirty[i]; dstart[i] = table[p.x][p.y]; if(dstart[i] < 0) unsolve = true; } if(unsolve) { cout << -1 << endl; continue; } for(int i = 0; i < dn; ++i) { MakeTable(dirty[i]); for(int j = 0; j < dn; ++j) { Point p = dirty[j]; dist[i][j] = table[p.x][p.y]; //cout << dist[i][j] << " "; } //cout << endl; } int ans = -1; for(int i = 0; i < dn; ++i) { int t = Solve((1<