UVA1601TheMorningAfterHalloween

来源:互联网 发布:广州app商城源码 编辑:程序博客网 时间:2024/06/06 02:20
//UVA1601TheMorningAfterHalloween#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>#include<cctype>using namespace std;const int MAXN = 20;int deg[MAXN * MAXN];int G[1 << 17][5];int s[3], g[3];const int dx[] = {-1, 1, 0, 0, 0};const int dy[] = {0, 0, 1, -1, 0};int ID(int a, int b, int c) {return (a << 16) | (b << 8) | c;}inline bool conflict(int a, int b, int aa, int bb) {return aa == bb || a == bb && b == aa;}int dis[300][300][300];int bfs() {    //printf("***\n");    memset(dis, -1, sizeof(dis));queue<int> q;int id0 = ID(s[0], s[1], s[2]);dis[s[0]][s[1]][s[2]] = 0;q.push(id0);while(!q.empty()) {int id = q.front(); q.pop();int a = (id >> 16)&0xff, b = (id >> 8)&0xff, c = id&0xff;//printf("a = %d, b = %d, c = %d\n", a, b, c);if(a == g[0] && b == g[1] && c == g[2]) return dis[a][b][c];for(int i = 0; i < deg[a]; i++) {int aa = G[a][i];for(int j = 0; j < deg[b]; j++) {    int bb = G[b][j];if(conflict(a, b, aa, bb)) continue;for(int k = 0; k < deg[c]; k++) {int cc = G[c][k];//printf("cc = %d, c = %d, k = %d\n", cc, c, k);if(conflict(a, c, aa, cc)) continue;if(conflict(b, c, bb, cc)) continue;if(dis[aa][bb][cc] >= 0) continue;dis[aa][bb][cc] = dis[a][b][c] + 1;//printf("%d\n", dis[aa][bb][cc]);int tmp_id = ID(aa, bb, cc);q.push(tmp_id);}}} }}int main() {int w, h, n;while(scanf("%d%d%d", &w, &h, &n) == 3 && w) {memset(G, 0, sizeof(G));memset(deg, 0, sizeof(deg));int cnt = 0, x[MAXN * MAXN], y[MAXN *MAXN];        int id[MAXN][MAXN];        char maze[MAXN][MAXN] = {0};        getchar();int i = 0;for(i = 0; i < h; i++)     fgets(maze[i], 20, stdin);//printf("*****i = %d\n", i);//for(int i = 0; i < w; i++) puts(maze[i]);for(int i = 0; i < h; i++) {        for(int j = 0; j < w; j++){        if(islower(maze[i][j])) {        s[maze[i][j] - 'a'] = cnt;    }     if(isupper(maze[i][j])) {    g[maze[i][j] - 'A'] = cnt;}if(maze[i][j] != '#') {    x[cnt] = i; y[cnt] = j;    id[i][j] = cnt++;}    }}for(int i = 0; i < cnt; i++) {deg[i] = 0;for(int dir = 0; dir < 5; dir++) {int nx = x[i] + dx[dir]; int ny = y[i] + dy[dir];if(nx >= 0 && nx < h && ny >= 0 && ny < w && maze[nx][ny] != '#') G[i][deg[i]++] = id[nx][ny];}}if(n <= 2) {s[2] = g[2] = cnt; deg[cnt] = 1; //printf("cnt = %d\n", cnt);G[cnt][0] = cnt;//printf("***G[%d][0] = %d\n", cnt, G[cnt][0]);cnt++;}if(n <= 1) {s[1] = g[1] = cnt; deg[cnt] = 1; G[cnt][0] = cnt; cnt++;}printf("%d\n", bfs());}return 0;}/*5 5 2######A#B##   ##b#a######16 4 3################## ########## ###    ABCcba    #################16 16 3################### ##    #   ####  #  ##   # c##  ## ########b## ##  # #   #  ##  # ##   # # ####  a#  # # #  #### ## #### ## ###   #   #  #  ##  ##### # ## ######   #B# #   ###  C#   #   ####  # # ####### ## ######  A##  ##        #    ##################0 0 0*/

原创粉丝点击