1: // Homework 6.3: FIRE! 2: 3: // Build a map of the distance from each point to the nearest door by 4: // setting all distances to infinity, except the door squares which are 5: // zero, and then repeatedly lowering each space to the minimum of its 6: // neighbors plus the cost (time) of leaving the space. 7: // (basically Dijkstra's algorithm...) 8: 9: #include <iostream.h> 10: 11: #define INF 10000 12: 13: char map[50][50]; 14: int dist[50][50]; 15: 16: int main() { 17: int w, h, a, na; 18: cin >> w >> h >> a >> na; 19: char c; 20: int x, y; 21: for (x=0; x<w; x++) for (y=0; y<h; y++) 22: { map[x][y] = ' '; dist[x][y] = INF; } 23: for (x=0; x<w; x++) map[x][0] = map[x][h-1] = 'W'; 24: for (y=0; y<h; y++) map[0][y] = map[w-1][y] = 'W'; 25: while (cin >> c >> x >> y && (c == 'D' || c == 'T')) { 26: map[x][y] = c; 27: if (c == 'D') dist[x][y] = 0; 28: } 29: 30: int i, j, flag=1; 31: while (flag) { 32: flag = 0; 33: for (i=0; i<w; i++) 34: for (j=0; j<h; j++) { 35: if (map[i][j] != ' ') continue; 36: int m, n, minn = INF, aisle=1; 37: for (m=-1; m<=1; m++) 38: for (n=-1; n<=1; n++) 39: if (i+m >= 0 && i+m < w && j+n >= 0 && j+n < h && (m||n)) { 40: if (map[i+m][j+n] == 'T') aisle=0; 41: if (dist[i+m][j+n] < minn && (!m||!n)) minn = dist[i+m][j+n]; 42: } 43: if (minn + (aisle ? a : na) < dist[i][j]) { 44: dist[i][j] = minn + (aisle ? a : na); 45: flag = 1; 46: } 47: } 48: } 49: 50: do { 51: cout << "The patron located at position (" << x << ", " << y << 52: ") will require " << dist[x][y] << " seconds to exit the building." << 53: endl; 54: } while (cin >> c >> x >> y && c == 'P'); 55: cout << "END OF OUTPUT" << endl; 56: return 0; 57: }