正经题解|大富翁游戏
2024-04-23 13:40:49
发布于:浙江
85阅读
0回复
0点赞
按照题意进行模拟,代码中有详细注释。
#include <iostream>
#include <vector>
using namespace std;
long long C[109][109], d[109], a[109], id[109], level[109];
//id[i]表示i位置上的房子的归属 0:没有房子 1:属于小码君 2:属于小码酱
//level[i]表示i位置上的房子的等级
vector<pair<int,int> >ve;//first存储是行走还是建造房子
int main() {
long long n, m, q, L;
cin >> n >> m >> q >> L;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < L; j++) {
cin >> C[i][j];
}
}
for (int i = 1; i <= n; i++) {
cin >> d[i];
}
long long opt, k, player = 1, m1 = m, m2 = m; //player表示当前操作是哪一方,0:小码君 1:小码酱
while (cin >> opt >> k) {
ve.push_back({ opt,k });
}
int loc1 = 1, loc2 = 1;//小码君和小码酱当前所处位置
for (int i = 0; i < ve.size(); i++) {
player ^= 1;//交换操作方
if (player == 0) { //小码酱操作
for (int j = 1; j <= ve[i].second; j++) {//走ve[i].second步
loc1++; //向前走一步
if (loc1 == n + 1) {//从n的位置回到1的位置
loc1 = 1;
}
if (id[loc1] == 1) {//如果当前的房子是自己建的
m1 += a[loc1]; //额外获得金钱
} else if (id[loc1] == 2) { //当前房子是对方建的
m1 -= a[loc1], m2 += a[loc1];//支付相应金钱给对方
if (m1 < 0) {//当拥有金钱小于0,游戏立即结束
cout << "JUN" << '\n';
return 0;
}
}
}
if (i + 1 < ve.size() && ve[i + 1].first == 2) {//建造房子
i++;
if (id[loc1] <= 1) {//当这个地方没有建造房子或者建造的房子是自己的
bool flag = false;
for (int j = level[loc1]; j < min(L, level[loc1] + ve[i].second); j++) {//要升ve[i].second级,且不能超过L级
if (m1 >= C[loc1][j]) {//所剩金钱足够
m1 -= C[loc1][j], a[loc1] += C[loc1][j];//减少所拥有的金钱
id[loc1] = 1;//标记这个建筑物所属
} else {
level[loc1] = j; //钱不够只能升到j级
flag = true;
break;
}
}
if (!flag) {//金钱足够升级
level[loc1] = min(L, level[loc1] + ve[i].second);
}
}
}
} else {
for (int j = 1; j <= ve[i].second; j++) { //移动ve[i].second次
loc2++;
if (loc2 == n + 1) {
loc2 = 1;
}
if (id[loc2] == 2) {
m2 += a[loc2]; //loc2位置是自己的建筑
}
else if (id[loc2] == 1) { //loc2位置是别人的建筑
m1 += a[loc2], m2 -= a[loc2]; //支付相应资金
if (m2 < 0) { //如果资金为负
cout << "JIANG" << '\n';
return 0;
}
}
}
if (i + 1 < ve.size() && ve[i + 1].first == 2) {
i++;
if (id[loc2] % 2 == 0) {
//将loc2的建筑物标注成自己的
bool flag = false;
for (int j = level[loc2]; j < min(L, level[loc2] + ve[i].second); j++) { //看着升级
if (m2 >= C[loc2][j]) {
m2 -= C[loc2][j], a[loc2] += C[loc2][j];
id[loc2] = 2;
}
else {
level[loc2] = j;
flag = true;
break;
}
}
if (!flag) {
level[loc2] = min(L, level[loc2] + ve[i].second);
}
}
}
for (int j = 1; j <= n; j++) {//过了一轮,每个自己的建筑物为自己提供相应资金
if (id[j] == 1) {
m1 += d[j];
}
else if (id[j] == 2) {
m2 += d[j];
}
}
}
}
cout << m1 << " " << m2 << '\n';
return 0;
}
全部评论 1
《阶乘》
2024-04-23 来自 广东
0感谢提醒,已修改
2024-04-23 来自 浙江
0
有帮助,赞一个