掷骰子问题

掷骰子问题
(Input File: dice.in; Output: Standard Output)

一个简单的几代孩子都玩过的纸板游戏由一块包含一系列正方形格子的纸板和一些颜色纸片组成。游戏开始时,每个儿童都有一块不同颜色的纸片,而且所有纸片开始都放在第一个正方形格子之前
玩游戏以轮的方式进行。在每一轮中,孩子们掷一对骰子,并把他们的纸片沿正方形格子向前移动他们掷出的结果数。每一轮中他们总是以相同的顺序掷骰子(儿童A,儿童B,等等)。
纸板上绝大多数正方形格子都是普通的正方形,但也有某些是“陷阱”。如果一个儿童的纸片在移动之后落在陷阱中,那么这个孩子下轮就会轮空。他的纸片也会保持不动。
整个格子系列中恰好只有三个陷阱。
游戏的赢家是其纸片第一个到达格子系列的尾端,它在格子系列中最后一个格子的后面。例如,考虑上图中的纸板,其正方形格子从148编号。开始时,纸片放在标记有“Begin”的位置,即,在格子1之前。因此,如果一个儿童掷出了7(例如,骰子12,骰子25),那么他的纸片就可移到格子7中。而且,如果一个儿童的纸片原来是在格子41中,那么他要掷出至少8才能到达格子的尾端并赢得游戏。注意游戏不会有平局。给定儿童人数,格子系列中正方形的个数,陷阱的位置,以及一系列骰子点数,写一个程序确定赢家是谁。
Input
你的程序要处理多个测试用例。每个测试用例的第一行是两个整数PS,分别表示儿童人数及格子数(1P10 and 3S10000)。第二行描述陷阱,用三个不同的整数T1,T 2and T3表示它们在格子系列中的位置(1T1,T2,T3S). 第三行是一个整数N,表示测试中掷骰子的次数。后面的N行中每行是两个整数D1D2(1D1,D26),表示每个骰子点数。输入最后以两个0结束。每个测试中骰子点数集总是恰好会导致一个人赢。
儿童编号从1P。每一轮他们总是以相同的顺序(从1P)来掷骰子。
Output
对每个测试用例,输出表示赢家的编号。
Sample input
2 10
2 4 8
4
1 1
3 4
1 2
6 5
3 7
4 5 7
7
1 2
2 2
2 1
1 1
1 2
1 1
1 1

 0 0
Output for the sample input
1

import  java.io. *
import  java.util. *
class  people 

int step; 
boolean isOk; 
public people() 

  
this.step=0
  isOk
=true
}
 
}
 
class  Test2 

public static void main(String[] args) throws IOException 

  BufferedReader bf
=new BufferedReader(new FileReader("dice.in")); 
  String str; 
  
int who=0
  
while(!(str=bf.readLine()).equals("0 0")) 
  

   StringTokenizer tag
=new StringTokenizer(str); 
   
int people_number=Integer.parseInt(tag.nextToken()); 

   people person[]
=new people[people_number]; 
   
for(int i=0;i<person.length;i++) person[i]=new people(); 
   
int goal=Integer.parseInt(tag.nextToken()); 
   tag
=new StringTokenizer(bf.readLine()); 

   
int danger[]=new int[tag.countTokens()]; 
    
for(int i=0;i<danger.length;i++
    danger[i]
=Integer.parseInt(tag.nextToken()); 
   
int n=Integer.parseInt(bf.readLine()); 
   String s[]
=new String[n]; 
            
for(int i=0;i<n;i++)//骰子 
    s[i]=bf.readLine(); 

   
int STEP[]=new int[n]; 
   
for(int i=0;i<n;i++
   

    tag
=new StringTokenizer(s[i]); 
    STEP[i]
=Integer.parseInt(tag.nextToken())+Integer.parseInt(tag.nextToken()); 
   }
 
   
boolean bool=false;   
   
int j=0
   
while(bool==false
   
{   
    
for(int i=0;i<person.length;i++,j++
    

     
if(j==STEP.length)j=0;     
     
if(person[i].step>goal) 
     

      bool
=true
      who
=i; 
      
break
}
 
     
if(person[i].isOk==false
     

      person[i].isOk
=true
      j
--
      
continue
     }
 
     person[i].step
+=STEP[j]; 
     
if(!isGo(person[i].step,danger)) 
      person[i].isOk
=false
    }
 
   }
 
   System.out.println(who
+1); 
  }
 
}
 
public static boolean isGo(int step,int danger[]) 

  
for(int i=0;i<danger.length;i++
   
if(step==danger[i]) 
   
return false
  
return true
}
 
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值