【HDOJ】3295 An interesting mobile game
其实就是一道搜索模拟题。因为数据量小,用char就够了。
1 /* 3295 */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <queue> 7 using namespace std; 8 9 typedef struct { 10 char m[6][6]; 11 char x, y; 12 char s, c; 13 } node_t; 14 15 typedef struct subNode_t { 16 char x, y; 17 subNode_t() {} 18 subNode_t(char xx, char yy) { 19 x = xx; y = yy; 20 } 21 } subNode_t; 22 23 bool visit[6][6]; 24 node_t beg, cur; 25 int n, m, cnt; 26 char dir[4][2] = { 27 -1,0,0,-1,1,0,0,1 28 }; 29 queue<node_t> Q; 30 queue<subNode_t> q; 31 32 inline bool check(char x, char y) { 33 return x<0 || x>=n || y<0 || y>=m; 34 } 35 36 void remove(char x, char y, char cl) { 37 char i, j, k; 38 subNode_t nd; 39 40 ++cur.s; 41 cur.m[x][y] = 0; 42 visit[x][y] = true; 43 --cur.c; 44 q.push(subNode_t(x, y)); 45 46 while (!q.empty()) { 47 nd = q.front(); 48 q.pop(); 49 for (i=0; i<4; ++i) { 50 x = nd.x + dir[i][0]; 51 y = nd.y + dir[i][1]; 52 if (check(x, y) || visit[x][y]) 53 continue; 54 if (cur.m[x][y] == cl) { 55 cur.m[x][y] = 0; 56 visit[x][y] = true; 57 --cur.c; 58 q.push(subNode_t(x, y)); 59 } 60 } 61 } 62 } 63 64 node_t shift() { 65 char i, j, k, r; 66 bool flag; 67 node_t nd; 68 69 // copy from cur 70 nd.s = cur.s; 71 nd.c = cur.c; 72 nd.x = cur.x; 73 nd.y = cur.y; 74 memset(nd.m, 0, sizeof(nd.m)); 75 76 // fall down 77 r = 0; 78 for (j=0; j<m; ++j) { 79 k = n-1; 80 for (i=n-1; i>=0; --i) 81 if (cur.m[i][j]) 82 nd.m[k--][r] = cur.m[i][j]; 83 if (k < n-1) 84 ++r; 85 } 86 87 return nd; 88 } 89 90 char bfs() { 91 char i, j, k; 92 node_t nd; 93 94 while (!Q.empty()) 95 Q.pop(); 96 97 memset(visit, false, sizeof(visit)); 98 for (i=0; i<n; ++i) { 99 for (j=0; j<n; ++j) { 100 if (beg.m[i][j] && !visit[i][j]) { 101 cur = beg; 102 remove(i, j, beg.m[i][j]); 103 nd = shift(); 104 Q.push(nd); 105 } 106 } 107 } 108 109 while (!Q.empty()) { 110 beg = Q.front(); 111 Q.pop(); 112 if (beg.c == 0) 113 return beg.s; 114 memset(visit, false, sizeof(visit)); 115 for (i=0; i<n; ++i) { 116 for (j=0; j<m; ++j) { 117 if (beg.m[i][j] && !visit[i][j]) { 118 cur = beg; 119 remove(i, j, beg.m[i][j]); 120 nd = shift(); 121 Q.push(nd); 122 } 123 } 124 } 125 } 126 127 return 0; 128 } 129 130 int main() { 131 int i, j, k; 132 133 #ifndef ONLINE_JUDGE 134 freopen("data.in", "r", stdin); 135 #endif 136 137 while (scanf("%d%d",&n,&m) != EOF) { 138 cnt = 0; 139 beg.s = 0; 140 for (i=0; i<n; ++i) { 141 for (j=0; j<m; ++j) { 142 scanf("%d", &k); 143 beg.m[i][j] = k; 144 if (k) 145 ++cnt; 146 } 147 } 148 beg.c = cnt; 149 k = bfs(); 150 printf("%d\n", k); 151 } 152 153 return 0; 154 }