考察知识点:模拟
大模拟题,需要考虑的情况比较多,下面的代码提供了一种写法。
时间复杂度:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
#define N 505
void solve()
{
int n, m, k;
cin >> n >> m >> k;
int board[N][N] = {0}; // 棋盘,记录领土标号
int cnt = 0; // 标号计数
map<string, pii> pos; // 记录军队位置
map<string, int> power; // 记录军队战力(即领土数量)
map<string, vi> domain; // 记录军队占领领土的标号
map<int, string> belong; // 记录领土归属
while (k--)
{
string name;
int x, y;
cin >> name >> x >> y;
if (board[x][y] == 0) // 投放位置为空地
{
board[x][y] = ++cnt;
belong[cnt] = name;
pos[name] = {x, y};
power[name] = 1;
domain[name].push_back(cnt);
}
else if (belong[board[x][y]] < name) // 投放位置有弱于自己的军队
{
string old = belong[board[x][y]];
pos.erase(old);
power.erase(old);
domain.erase(old);
belong[board[x][y]] = name;
pos[name] = {x, y};
power[name] = 1;
domain[name].push_back(board[x][y]);
}
}
map<char, pii> move = {{'W', {-1, 0}}, {'S', {1, 0}}, {'A', {0, -1}}, {'D', {0, 1}}};
int q;
cin >> q;
while (q--)
{
string name;
char op;
cin >> name >> op;
// 势力不存在或已消亡
if (pos.find(name) == pos.end())
{
cout << "unexisted empire." << endl;
continue;
}
pii cur = pos[name];
pii nxt = {cur.first + move[op].first, cur.second + move[op].second};
// 目标点越界
if (nxt.first < 1 || nxt.first > n || nxt.second < 1 || nxt.second > m)
{
cout << "out of bounds!" << endl;
continue;
}
// 目标点为空地
if (board[nxt.first][nxt.second] == 0)
{
cout << "vanquish!" << endl;
board[nxt.first][nxt.second] = board[cur.first][cur.second];
pos[name] = nxt;
power[name]++;
domain[name].push_back(board[nxt.first][nxt.second]);
continue;
}
// 目标点为自己的领土
else if (belong[board[nxt.first][nxt.second]] == name)
{
cout << "peaceful." << endl;
pos[name] = nxt;
continue;
}
// 目标点为敌方领土
else
{
string enemy = belong[board[nxt.first][nxt.second]];
// 我方战胜敌方
if (power[name] > power[enemy] || (power[name] == power[enemy] && name > enemy))
{
cout << name << " wins!" << endl;
pos.erase(enemy);
power[name] += power[enemy];
power.erase(enemy);
while (!domain[enemy].empty()) // 敌方领土归我方所有
{
int tmp = domain[enemy].back();
domain[enemy].pop_back();
belong[tmp] = name;
domain[name].push_back(tmp);
}
domain.erase(enemy);
board[nxt.first][nxt.second] = board[cur.first][cur.second];
pos[name] = nxt;
continue;
}
// 我方战败
else
{
cout << enemy << " wins!" << endl;
pos.erase(name);
power[enemy] += power[name];
power.erase(name);
while (!domain[name].empty()) // 我方领土归敌方所有
{
int tmp = domain[name].back();
domain[name].pop_back();
belong[tmp] = enemy;
domain[enemy].push_back(tmp);
}
domain.erase(name);
continue;
}
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}