zoukankan      html  css  js  c++  java
  • 【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
    ", k);
    151     }
    152     
    153     return 0;
    154 }
  • 相关阅读:
    hdu 1176 免费馅饼
    http://codeforces.com/contest/741/problem/B B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    瞎搞题
    1D1D决策单调性dp
    整体二分(POJ2104 静态第k大查询)
    B
    http://codeforces.com/contest/776/problem/G
    http://codeforces.com/contest/776/problem/D 2-sat
    bzoj1492(cdq分治 && 平衡树维护dp)
    F. Bear and Bowling 4(斜率优化)
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4288988.html
Copyright © 2011-2022 走看看