# 12306 - beat the monster >author: Utin ###### tags: `BFS` --- ## Brief See the code below ## Solution 0 ```cpp= #include <bits/stdc++.h> struct State { int level, hp, mhp, step; State(int l, int h, int m, int s) : level(l), hp(h), mhp(m), step(s) {} }; int L, HP, MHP, MDMG, table[15][2]; bool check[16][301][401]; // record whether the state has been used std::queue<State> process; int main() { std::cin >> L >> HP >> MHP >> MDMG; for (int i = 0; i < L; i++) std::cin >> table[i][0] >> table[i][1]; process.push(State(0, HP, MHP, 0)); check[0][HP][MHP] = true; while (process.size()) { State curr = process.front(); process.pop(); // lose if (HP <= MDMG) break; // win if (curr.mhp <= table[curr.level][0]) { std::cout << curr.step + 1 << '\n'; return 0; } // attack if (curr.hp > MDMG && !check[curr.level][curr.hp - MDMG][curr.mhp - table[curr.level][0]]) { process.push(State(curr.level, curr.hp - MDMG, curr.mhp - table[curr.level][0], curr.step + 1)); check[curr.level][curr.hp - MDMG][curr.mhp - table[curr.level][0]] = true; } // heal if (curr.hp < HP) { int new_hp = curr.hp + table[curr.level][1]; if (new_hp > HP) new_hp = HP; if (new_hp > MDMG && !check[curr.level][new_hp - MDMG][curr.mhp]) { process.push(State(curr.level, new_hp - MDMG, curr.mhp, curr.step + 1)); check[curr.level][new_hp - MDMG][curr.mhp] = 1; } } // level up if (curr.level < L - 1 && curr.hp > MDMG) { process.push(State(curr.level + 1, curr.hp - MDMG, curr.mhp, curr.step + 1)); check[curr.level + 1][curr.hp - MDMG][curr.mhp] = true; } } std::cout << -1 << '\n'; } // By Utin ``` ## Reference