#include using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; using ld = long double; struct enemy_state { int hp; int power; }; struct own_state { int x = 12; int exp = 0; int level = 1; char action = 'S'; }; int N; // 敵機の数 int turn = 0; // ターン数 own_state own = own_state(); // 自機の状態 vector> field(25, vector(60)); // フィールドの初期化 vector enemy_count(25); // いままでに出現した敵の数 void set_field() { for (int i = 0; i < N; ++i) { int h, p, x; cin >> h >> p >> x; field[x][59].hp = h; field[x][59].power = p; enemy_count[x]++; } } void move_own() { // もしその場に居続けて敵を倒せるなら、その場に居続ける for (int i = 1; i < 60; i++) { if (field[own.x][i].hp > 0) { if (field[own.x][i].hp <= own.level * (i-1)) { own.action = 'S'; return; } else { break; } } } // 倒すことができる敵の中で、自機から一番近い敵を倒す for (int i = 1; i < 25; i++) { int x; if (i%2 == 1) { x = own.x + i; x = x % 25; } else { x = own.x - i; if (x < 0) { x = 25 + x; } } for (int j = 0; j < 60; j++) { if (field[x][j].hp > 0) { int dx = abs(x - own.x); if (field[x][j].hp <= own.level * (j - dx)) { if (x > own.x) { own.action = 'R'; } else if (x < own.x) { own.action = 'L'; } return; } } } } } void check_move() { bool ok_S = true, ok_R = true, ok_L = true; if (field[own.x][0].hp > 0) { ok_S = false; } if (field[(own.x+1)%25][0].hp > 0) { ok_R = false; } if (field[(own.x-1+25)%25][0].hp > 0) { ok_L = false; } if (own.action == 'S') { if (!ok_S) { if (ok_R) { own.action = 'R'; } else if (ok_L) { own.action = 'L'; } } } if (own.action == 'R') { if (!ok_R) { if (ok_S) { own.action = 'S'; } else if (ok_L) { own.action = 'L'; } } } if (own.action == 'L') { if (!ok_L) { if (ok_S) { own.action = 'S'; } else if (ok_R) { own.action = 'R'; } } } } void update_field() { // 敵を攻撃 for (int i = 0; i < 60; i++) { // 同じ列に敵がいたら、一番手前の敵だけを攻撃 if (field[own.x][i].hp > 0) { field[own.x][i].hp -= own.level; if (field[own.x][i].hp <= 0) { own.exp += field[own.x][i].power; own.level = 1 + own.exp / 100; field[own.x][i].hp = 0; field[own.x][i].power = 0; } break; } } // 下に移動 for (int i = 0; i < 59; i++) { for (int j = 0; j < 25; j++) { field[j][i] = field[j][i+1]; } } for (int i = 0; i < 25; i++) { field[i][59].hp = 0; field[i][59].power = 0; } // 自機の移動 if (own.action == 'S') { own.x = own.x; } else if (own.action == 'R') { own.x = own.x + 1; if (own.x == 25) { own.x = 0; } } else if (own.action == 'L') { own.x = own.x - 1; if (own.x == -1) { own.x = 24; } } cout << own.action << endl; // ターンを更新 turn++; if (turn == 1000) { exit(0); } } // デバッグ用 void print_field_hp() { for (int i = 0; i < 25; i++) { for (int j = 0; j < 60; j++) { cout << field[i][j].hp << ' '; } cout << '\n'; } } void print_field_power() { for (int i = 0; i < 25; i++) { for (int j = 0; j < 60; j++) { cout << field[i][j].power << ' '; } cout << '\n'; } } int main() { while (true) { cin >> N; if (N == -1) { // 終了 return 0; } // 敵が出現 set_field(); // 移動 move_own(); // 移動先に敵がいたら、移動しない。 check_move(); // ターンを更新 update_field(); } }