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