【HDOJ】1107 武林
简单模拟,题目数据太弱太弱了。
1 /* 1107 */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <vector> 7 #include <algorithm> 8 using namespace std; 9 10 typedef struct node_t { 11 int x, y; // position 12 int nl; // 内力 13 int wy; // 武艺 14 int hp; // 生命 15 bool hasFight; 16 int d; // direction: 0:up, down:1 17 node_t() {} 18 node_t(int xx, int yy, int nnl, int wwy, int hhp, bool h=false, int dd=0) { 19 x = xx; y = yy; nl = nnl; wy = wwy; 20 hp = hhp; hasFight=h; d = dd; 21 } 22 } node_t; 23 24 int map[15][15]; 25 vector<node_t> vnodes[3]; // 0:少林, 1:武当, 2:峨眉 26 int dir[3][2][2] = { 27 { {1, 0}, {-1, 0} }, 28 { {0, 1}, {-1, 0} }, 29 { {1, 1}, {-1, -1} } 30 }; 31 int nn[3]; 32 int t, n; 33 34 void init() { 35 memset(map, 0, sizeof(map)); 36 for (int i=0; i<3; ++i) { 37 vnodes[i].clear(); 38 nn[i] = 0; 39 } 40 } 41 42 inline bool check(int x, int y) { 43 return x>0 && x<13 && y>0 && y<13; 44 } 45 46 int getDPS(int i, int j) { 47 double tmp; 48 49 if (i == 0) { 50 tmp = (0.5*vnodes[i][j].nl + 0.5*vnodes[i][j].wy) * (vnodes[i][j].hp + 10.) / 100.0; 51 } else if (i == 1) { 52 tmp = (0.8*vnodes[i][j].nl + 0.2*vnodes[i][j].wy) * (vnodes[i][j].hp + 10.) / 100.0; 53 } else { 54 tmp = (0.2*vnodes[i][j].nl + 0.8*vnodes[i][j].wy) * (vnodes[i][j].hp + 10.) / 100.0; 55 } 56 57 return (int) tmp; 58 } 59 60 void fight() { 61 int dps0, dps1; 62 int i, j, k, p; 63 int ii, jj, kk; 64 int x, y; 65 66 for (i=0; i<3; ++i) { 67 for (j=0; j<nn[i]; ++j) { 68 if (vnodes[i][j].hp>0 && map[vnodes[i][j].x][vnodes[i][j].y]==2 && !vnodes[i][j].hasFight) { 69 x = vnodes[i][j].x; 70 y = vnodes[i][j].y; 71 vnodes[i][j].hasFight = true; 72 for (ii=0; ii<3; ++ii) { 73 if (ii == i) 74 continue; 75 for (jj=0; jj<nn[ii]; ++jj) { 76 if (vnodes[ii][jj].hp>0 && vnodes[ii][jj].x==x && vnodes[ii][jj].y==y) { 77 dps0 = getDPS(i, j); 78 dps1 = getDPS(ii, jj); 79 vnodes[i][j].hp -= dps1; 80 vnodes[ii][jj].hp -= dps0; 81 vnodes[ii][jj].hasFight = true; 82 } 83 } 84 } 85 } 86 } 87 } 88 } 89 90 void move() { 91 int i, j, k; 92 int x, y, xx, yy; 93 94 for (i=0; i<3; ++i) { 95 for (j=0; j<nn[i]; ++j) { 96 vnodes[i][j].hasFight = false; 97 x = vnodes[i][j].x; 98 y = vnodes[i][j].y; 99 --map[x][y]; 100 k = vnodes[i][j].d; 101 if (i == 0) { 102 if (x == 12) k = 1; 103 if (x == 1) k = 0; 104 if (k) { 105 --x; 106 } else { 107 ++x; 108 } 109 } else if (i == 1) { 110 if (y == 12) k = 1; 111 if (y == 1) k = 0; 112 if (k) { 113 --y; 114 } else { 115 ++y; 116 } 117 } else { 118 if (x==12 || y==12) 119 k = 1; 120 if (x==1 || y==1) 121 k = 0; 122 if ((x==1&&y==12) || (x==12 && y==1)) 123 /* do nothing */; 124 else { 125 if (k) { 126 --x; --y; 127 } else { 128 ++x; ++y; 129 } 130 } 131 } 132 vnodes[i][j].d = k; 133 vnodes[i][j].x = x; 134 vnodes[i][j].y = y; 135 ++map[x][y]; 136 } 137 } 138 } 139 140 int main() { 141 int i, j, k, tmp; 142 int x, y, nl, wy, hp; 143 char cmd[3]; 144 145 #ifndef ONLINE_JUDGE 146 freopen("data.in", "r", stdin); 147 freopen("data.out", "w", stdout); 148 #endif 149 150 scanf("%d", &t); 151 while (t--) { 152 init(); 153 scanf("%d", &n); 154 while (scanf("%s", cmd)!=EOF && (cmd[0]!='0')) { 155 scanf("%d %d %d %d %d", &x, &y, &nl, &wy, &hp); 156 if (cmd[0] == 'S') j = 0; 157 if (cmd[0] == 'W') j = 1; 158 if (cmd[0] == 'E') j = 2; 159 ++map[x][y]; 160 vnodes[j].push_back(node_t(x,y,nl,wy,hp)); 161 ++nn[j]; 162 } 163 while (n--) { 164 fight(); 165 move(); 166 } 167 for (i=0; i<3; ++i) { 168 k = 0; 169 n = 0; 170 for (j=0; j<nn[i]; ++j) { 171 if (vnodes[i][j].hp > 0) { 172 k += vnodes[i][j].hp; 173 ++n; 174 } 175 } 176 printf("%d %d\n", n, k); 177 } 178 puts("***"); 179 } 180 181 return 0; 182 }