Untitled
unknown
c_cpp
9 months ago
1.5 kB
2
Indexable
#include <iostream> #include <queue> #include <algorithm> using namespace std; struct State { int lv, hp,mhp; int dist; State(int lv, int hp, int mhp, int dist = 0): lv(lv), hp(hp), mhp(mhp), dist(dist) {} }; bool vis[20][310][410]; int main() { int lv, hp, mhp, mdmg; int dmg[20], hl[20]; cin >> lv >> hp >> mhp >> mdmg; for (int i=1; i<=lv; i++) { cin >> dmg[i] >> hl[i]; } queue<State> q; q.push(State(1, hp, mhp)); while (!q.empty()) { State s = q.front(); if (s.mhp <= 0) break; q.pop(); // level up if (s.hp - mdmg > 0 && s.lv < lv) { State t(s.lv + 1, s.hp - mdmg, s.mhp, s.dist + 1); if (!vis[t.lv][t.hp][t.mhp]) { vis[t.lv][t.hp][t.mhp] = true; q.push(t); } } // attack if (s.hp - mdmg > 0 || s.mhp - dmg[s.lv] <= 0) { State t(s.lv, s.hp - mdmg, s.mhp - dmg[s.lv], s.dist + 1); if (!vis[t.lv][t.hp][t.mhp]) { vis[t.lv][t.hp][t.mhp] = true; q.push(t); } } // heal if (hp > mdmg > 0 && hl[s.lv] > mdmg) { State t(s.lv, min(hp, s.hp+ hl[s.lv]) - mdmg, s.mhp, s.dist + 1); if (!vis[t.lv][t.hp][t.mhp]) { vis[t.lv][t.hp][t.mhp] = true; q.push(t); } } } if (q.empty()) cout << -1 << endl; else cout << q.front().dist << endl; }
Editor is loading...
Leave a Comment