【HDOJ】3500 Fling

题意巨难懂。简言之,就是球互相碰撞时,主动碰撞的球将会停止,另一个球将沿着碰撞方向继续移动,不断碰撞。但是无法弹射紧挨着的球,但是若a弹射b,bc相邻,这种情况b可以弹射c。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 using namespace std;
  6 
  7 #define MAXN 10
  8 
  9 typedef struct {
 10     int x, y;
 11     char d;
 12 } node_t;
 13 
 14 node_t nodes[15];
 15 char map[MAXN][MAXN];
 16 int on;
 17 // U < L < R < D.
 18 int dir[4][2] = {-1,0,0,-1,0,1,1,0};
 19 
 20 bool check(int x, int y) {
 21     return x<0||x>=7||y<0||y>=8;
 22 }
 23 
 24 char getDir(int k) {
 25     if (k==0) return 'U';
 26     if (k==1) return 'L';
 27     if (k==2) return 'R';
 28     return 'D';
 29 }
 30 
 31 bool dfs(int n) {
 32     int i, j, k, x, y;
 33     bool flag;
 34 
 35     if (n == 0)
 36         return true;
 37 
 38     for (i=0; i<7; ++i) {
 39         for (j=0; j<8; ++j) {
 40             if (map[i][j] == 'O') {
 41                 for (k=0; k<4; ++k) {
 42                     x = i + dir[k][0];
 43                     y = j + dir[k][1];
 44                     if (check(x, y) || map[x][y]=='O')
 45                         continue;
 46                     flag = false;
 47                     while (!check(x, y)) {
 48                         if (map[x][y] == 'O') {
 49                             flag = true;
 50                             map[x][y] = 'X';
 51                             map[x-dir[k][0]][y-dir[k][1]] = 'O';
 52                         }
 53                         x += dir[k][0];
 54                         y += dir[k][1];
 55                     }
 56                     if (flag) {
 57                         map[i][j] = 'X';
 58                         nodes[n].x = i;
 59                         nodes[n].y = j;
 60                         nodes[n].d = getDir(k);
 61                         if (dfs(n-1))
 62                             return true;
 63                         do {
 64                             x -= dir[k][0];
 65                             y -= dir[k][1];
 66                             if (map[x][y] == 'O') {
 67                                 map[x][y] = 'X';
 68                                 map[x+dir[k][0]][y+dir[k][1]] = 'O';
 69                             }
 70                         } while (x!=i || y!=j);
 71                         map[i][j] = 'O';
 72                     }
 73                 }
 74             }
 75         }
 76     }
 77 
 78     return false;
 79 }
 80 
 81 int main() {
 82     int i = 0, j;
 83     int t = 0;
 84 
 85 #ifndef ONLINE_JUDGE
 86     freopen("data.in", "r", stdin);
 87 #endif
 88 
 89     while (scanf("%s", &map[i]) != EOF) {
 90         for (i=1; i<7; ++i)
 91             scanf("%s", &map[i]);
 92         on = 0;
 93         for (i=0; i<7; ++i)
 94             for (j=0; j<8; ++j)
 95                 if (map[i][j] == 'O')
 96                     ++on;
 97         dfs(on-1);
 98 
 99         if (t != 0)
100             printf("\n");
101         printf("CASE #%d:\n", ++t);
102         for(i=on-1; i>=1; --i)
103             printf("%d %d %c\n", nodes[i].x, nodes[i].y, nodes[i].d);
104         getchar();
105         i = 0;
106     }
107 
108     return 0;
109 }

 

posted on 2014-10-24 11:19  Bombe  阅读(133)  评论(0编辑  收藏  举报

导航