游戏棋
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
相信大家都听说过大富翁这个游戏,一个不断进行色子抛出和买卖的格子游戏。在这个游戏中我们可以对于自己财产进行买卖。并且按照自己策略不断积攒财富。而且,在不同的地主对于玩家还有相应的惩罚机制。这都给这个汉诺带来了极大的趣味性。
郑州大学ACM实验室中最近这个游戏相当之流行。可以说大富翁的重要程度已经仅仅排在了训练的后面。但是网络中所能提供的地图是有限的,所以实验室的同学玩的时间长了之后就感觉非常无聊。可恶的开发团队并没有给出地图设计的软件。这个让整个实验室的同学们很纠结。所以他们最终决定自己开发一大套自己的大富翁游戏软件。在这个游戏内部测试版本中色子的功能被取消。每次一个人向前走一步。并且按照设定好的方式进行游戏。
在整个过程中,我们只有一种商品:房子。而且在整个过程中只有4种操作,分别是价格上升,价格下降,买房子,卖掉所有的房子。在游戏开始的时候我们会给予你一定的启动资金。
当你的资产大于原来的二倍的时候。(包括你的现金和房子数量乘以当前的价格,也就是说房子即使不卖出,也可以算做资产的部分)你就赢得了游戏。如果你的资产在某个时刻达到了原来的1/2之下。那你将失败。如果你在300次操作过程内没有结束游戏,那么就说明游戏本身设计的是有问题的。毕竟我们不能让我们的ACMer们过于沉迷于此。而且因为游戏是前期产品,如果游戏要求你买的房子超过你的现有资金或者要求你卖出的房子超过你的现有的房子数量。那么游戏将直接报错。
-
输入
-
输入分两部分:
第一部分 有一个整数T(1<=T<=10)表示测试组数。
第二部分 共T组,对于每组数据:
第一行有三个个数字X,Y和Z,表示整个游戏棋的大小,房子的初始价格,以及你的初始资产0<N<100,0<Y<50,5<Z<1000。
第二行到第N+1行是N个格子中的内容。你将顺次从第一个格子走到最后一个,然后再从第一个开始。四种内容分别是"price_up x","price_down x","sell x houses","buy x houses"其分别表示房子的价格上升x元,房子价格下降x元,卖掉x个房子,买入x个房子。
输出
-
如果你在300步之内赢得比赛那么输出"win",如果300步内输掉了比赛,那么输出"lose",如果你走到301步,那么直接输出"bad game"。
如果游戏报错了,直接输出"error"
样例输入
-
1 4 3 100 buy 30 houses price_up 1000 sell 30 houses price_down 100
样例输出
-
win
-
输入分两部分:
代码:
#include<stdio.h>
#include<string.h>
char s[15], house[15];
typedef struct
{
int flag;
int x;
}S;
S d[110];
int main()
{
int tcases;
int X, i, housenum, Y, Z, x, FM, len;
int m, count, over;
scanf("%d", &tcases);
while(tcases--)
{
scanf("%d%d%d", &X, &Y, &Z);
FM = Z;
for(i = 0; i < X; i++)
{
scanf("%s", s);
len = strlen(s);
if(len == 8)
{
scanf("%d", &x);
d[i].flag = 0;
d[i].x = x;
}
else if(len == 10)
{
scanf("%d", &x);
d[i].flag = 1;
d[i].x = x;
}
else if(len == 3)
{
scanf("%d", &x);
scanf("%s", house);
d[i].flag = 2;
d[i].x = x;
}
else if(len == 4)
{
scanf("%d", &x);
scanf("%s", house);
d[i].flag = 3;
d[i].x = x;
}
}
count = 0; over = 0; housenum = 0;
while(count < 300 && !over)
{
if( Z + housenum * Y > FM * 2)
{
over = 1;
printf("win\n");
continue;
}
if(Z + housenum * Y < FM / 2)
{
over = 1;
printf("lose\n");
continue;
}
m = count % X;
count++;
if(d[m].flag == 0)
{
Y += d[m].x;
continue;
}
if(d[m].flag == 1)
{
Y -= d[m].x;
continue;
}
if(d[m].flag == 2)
{
if(d[m].x * Y > Z)
{
over = 1;
printf("error\n");
continue;
}
Z = Z - d[m].x * Y;
housenum += d[m].x;
continue;
}
if(d[m].flag == 3)
{
if(housenum < d[m].x)
{
over = 1;
printf("error\n");
continue;
}
housenum -= d[m].x;
Z = Z + d[m].x * Y;
continue;
}
}
if(!over)
printf("bad game\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
char gamecon[105][30];
int main()
{
int i,t,gamestep,houseowned,winsig,scur;
float oriprice,startmoney,orimoney,intinput;
char temp1[30],temp2[30];
//freopen("E:\\input.txt","r",stdin);
scanf("%d",&t);
while (t--)
{
winsig=0;
houseowned=0;
scanf("%d%f%f\n",&gamestep,&oriprice,&orimoney);
startmoney=orimoney;
for (i=0;i<gamestep;i++)
gets(gamecon[i]);
for (i=0;i<300;i++)
{
scur=i%gamestep;
if (gamecon[scur][0]=='b')
{
sscanf(gamecon[scur],"%s%f%s",&temp1,&intinput,&temp2);
orimoney-=intinput*oriprice;
houseowned+=intinput;
if (orimoney<0)
{
winsig=2;
break;
}
}
else if (gamecon[scur][0]=='s')
{
sscanf(gamecon[scur],"%s%f%s",&temp1,&intinput,&temp2);
if (intinput>houseowned)
{
winsig=2;
break;
}
orimoney+=intinput*oriprice;
houseowned-=intinput;
}
else
{
sscanf(gamecon[scur],"%s%f",&temp1,&intinput);
if (strcmp(temp1,"price_up")==0)
{
oriprice+=intinput;
if (oriprice*houseowned+orimoney>2*startmoney)
{
winsig=1;
break;
}
}
else
{
oriprice-=intinput;
if (oriprice*houseowned+orimoney<startmoney/2)
{
winsig=4;
break;
}
}
}
}
if (winsig==1)
printf("win\n");
else if (winsig==0)
printf("bad game\n");
else if (winsig==4)
printf("lose\n");
else
printf("error\n");
}
return 0;
}