10年 ZZUPC校赛第三题 游戏棋(模…

游戏棋

TimeLimit: 1000MS  MemoryLimit: 32768 Kb

Description

 

       相信大家都听说过大富翁这个游戏,一个不断进行色子抛出和买卖的格子游戏。在这个游戏中我们可以对于自己财产进行买卖。并且按照自己策略不断积攒财富。而且,在不同的地方对于玩家还有相应的惩罚机制。这都给这个游戏带来了极大的趣味性。

     郑州大学ACM实验室中最近这个游戏相当之流行。可以说大富翁的重要程度已经仅仅排在了训练的后面。但是网络中所能提供的地图是有限的,所以实验室的同学玩的时间长了之后就感觉非常的无聊。可恶的开发团队并没有给出地图设计软件。这个让整个实验室的同学很纠结。所以他们最终决定自己开发一套自己的大富翁游戏软件。在这个游戏的内部测试版本中,色子的功能被取消。每次一个人向前走一步。并且按照设定好的方式进行游戏。

       在整个过程中我们只有一种商品:房子。而且在整个过程中只有4种操作,分别是价格上升,价格下降,买房子,卖掉所有的房子。在游戏开始的时候我们会给予你一定的启动资金。

当你的资产大于原来的二倍的时候。(包括你的现金和房子数量乘以当前的价格,也就是说房子即使不卖出,也可以算做资产的部分)你就赢得了游戏。如果你的资产在某个时刻达到了原来的1/2之下。那么你将失败。如果你在300次操作过程内没有结束游戏,那么就说明游戏本身设计的是有问题的。毕竟我们不能让我们的ACMer们过于沉迷于此。而且因为游戏是前期产品,如果游戏要求你买的房子超过你的现有资金或者要求你卖出的房子超过你的现有的房子的数量。那么游戏将直接报错。

 

Input

 

输入分两部分:

第一部分有一个整数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个房子。

 

Output

 

       如果你在300步之内赢得比赛那么输出"win",如果你在300步之内输掉了比赛,那么输出"lose",如果你走到了第301步,那么直接输出"bad game"。

       如果游戏报错了,则直接输出"error"

 

Sample Input

 

1

100

buy  30  houses

price_up  1000

sell  30  houses

price_down  100

 

Sample Output

 

win

 

Hint

 

thanks somebody

 

 

模拟题。

 

第二道A的题。

 

回想赛场,海轮给我说的这个题,我没有多看题目,就开始敲,开始按我的想法一厢情愿地敲!后果惨重。后认真读题,删改,哎。下次一定要完全理解题意后再敲。

 

开始脑子是一团糟的,后来迷迷糊糊给A了,脑子还是不够清楚。

 

昨天重写这道题,脑子里思路很清晰,很很清晰,敲得很快,呵呵。

 

这道题很锻炼人的思路呀,看能不能把自己想的实现出来,呵呵。

 

几个步骤,房价上升,下降,买房子,卖房子。

 

如果总资产(房子数*当前房价+剩余钱数)为原来的二倍以上就win,原来二分之一一下,输出lose。

 

如果300回合后还没win or lose,输出 bad game。

view plaincopy to clipboardprint?
#include <stdio.h>  
#include <stdlib.h>  
#include <iostream>  
#include <string.h>  
using namespace std;  
typedef struct{    // Struct is gelivable . I should try to like to use it. = =..  
    int flag;      // flag the length. To distinguish the operation.  
    int bnum,snum,upp,downp; // meaning the buy houses' num and so on ..  
}S;  
S step[110];  
int main(void)  
 
    int ncases,n;  
    char str[15],house[15];  
    int hnum,hprice,money; // houses'num   houses' price  
    scanf("%d",&ncases);  
    while( ncases-- )  
    
        scanf("%d%d%d",&n,&hprice,&money);  
        int save = money;  // save the initial money.  
        hnum = 0;  
        for(int i=0; i<n; i++)  
        
            scanf("%s",str);  
            int len = strlen(str);    
            if( len == 3 )  
            
                step[i].flag = 3;  
                scanf("%d %s",&step[i].bnum,house);  
                continue;  
            
            if( len == 4 )  
            
                step[i].flag = 4;  
                scanf("%d %s",&step[i].snum,house);  
                continue;  
            
            if( len == 8 )  
            
                step[i].flag = 8;  
                scanf("%d",&step[i].upp);  
                continue;  
            
            if( len == 10 )  
            
                step[i].flag = 10;  
                scanf("%d",&step[i].downp);  
                continue;  
            
        
        int count = 0, over = 0;  // count for counting ... over flag whether the game over .  
        while( count < 300 && !over )  
        
            if( (money + hnum*hprice)*2 < save )  // put it here is more clear.  
            
                over = 1;  
                printf("lose\n");  
                continue;  
            
            if( money + hnum*hprice > save * 2 ) // so as this .  
            
                over = 1;  
                printf("win\n");  
                continue;  
            
            int m = count % n; // compute the index of the operation.  
            count++;  
            int x = step[m].flag;  
            if( x == 3 )  
            
                if( money < step[m].bnum * hprice )  
                
                    over = 1;  
                    printf("error\n");  
                    continue;  
                
                else 
                
                    money -= step[m].bnum * hprice;  
                    hnum += step[m].bnum;  
                    continue;  
                
            
            if( x == 4 )  
            
                if( hnum < step[m].snum )  
                
                    over = 1;  
                    printf("error\n");  
                    continue;  
                
                else 
                
                    money += step[m].snum * hprice;  
                    hnum -= step[m].snum;  
                    continue;                     
                
            
            if( x == 8 )  
            
                hprice += step[m].upp;  
                continue;  
            
            if( x == 10 )  
                hprice -= step[m].downp;  
        
        if( !over )  
            printf("bad game\n");  
    
return 0;  

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
typedef struct{    // Struct is gelivable . I should try to like to use it. = =..
 int flag;      // flag the length. To distinguish the operation.
 int bnum,snum,upp,downp; // meaning the buy houses' num and so on ..
}S;
S step[110];
int main(void)
{
 int ncases,n;
 char str[15],house[15];
 int hnum,hprice,money; // houses'num   houses' price
 scanf("%d",&ncases);
 while( ncases-- )
 {
  scanf("%d%d%d",&n,&hprice,&money);
  int save = money;  // save the initial money.
  hnum = 0;
  for(int i=0; i<n; i++)
  {
   scanf("%s",str);
   int len = strlen(str); 
   if( len == 3 )
   {
    step[i].flag = 3;
    scanf("%d %s",&step[i].bnum,house);
    continue;
   }
   if( len == 4 )
   {
    step[i].flag = 4;
    scanf("%d %s",&step[i].snum,house);
    continue;
   }
   if( len == 8 )
   {
    step[i].flag = 8;
    scanf("%d",&step[i].upp);
    continue;
   }
   if( len == 10 )
   {
    step[i].flag = 10;
    scanf("%d",&step[i].downp);
    continue;
   }
  }
  int count = 0, over = 0;  // count for counting ... over flag whether the game over .
  while( count < 300 && !over )
  {
   if( (money + hnum*hprice)*2 < save )  // put it here is more clear.
   {
    over = 1;
    printf("lose\n");
    continue;
   }
   if( money + hnum*hprice > save * 2 ) // so as this .
   {
    over = 1;
    printf("win\n");
    continue;
   }
   int m = count % n; // compute the index of the operation.
   count++;
   int x = step[m].flag;
   if( x == 3 )
   {
    if( money < step[m].bnum * hprice )
    {
     over = 1;
     printf("error\n");
     continue;
    }
    else
    {
     money -= step[m].bnum * hprice;
     hnum += step[m].bnum;
     continue;
    }
   }
   if( x == 4 )
   {
    if( hnum < step[m].snum )
    {
     over = 1;
     printf("error\n");
     continue;
    }
    else
    {
     money += step[m].snum * hprice;
     hnum -= step[m].snum;
     continue;     
    }
   }
   if( x == 8 )
   {
    hprice += step[m].upp;
    continue;
   }
   if( x == 10 )
    hprice -= step[m].downp;
  }
  if( !over )
   printf("bad game\n");
 }
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值