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*/
阅读全文
0 0
- UVA1601TheMorningAfterHalloween
- AYIT2017暑假集训第二周周三赛 E
- 数论积累
- Apache 漏洞之后缀名解析漏洞
- Maven
- G
- UVA1601TheMorningAfterHalloween
- LeetCode- 125. Valid Palindrome
- LeetCode-541. Reverse String II
- Java集合框架(3)——HashMap
- Two point
- LeetCode-345. Reverse Vowels of a String
- k`th number
- LeetCode-344. Reverse String
- PLSQL Developer 12 64位下载 v12.0.4汉化中文版