圆桌问题
题目
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
#输入
多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);
输出
对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一空行。
思路
既然要找到所有坏人的位置,那我们可以用数组循环来找到,找到那个位置,我们就标记,如果在找的过程中遇到了被标记的位置,那我们就不记这次,直接跳到下一个位置,如果找的位置超过了总的位置,我们就返回最开始的位置继续找
import java.util.*;
public class Main {
public static void main(String[] args) {
int count=0;
List<StringBuffer> list=new ArrayList();
Scanner in=new Scanner(System.in);
while(in.hasNext()) {
int T=in.nextInt();
int step=in.nextInt();
int flag=0;
String[] a=new String[2*T+5];
for(int i=0;i<T;i++) {
//tem表示的是下标
int tem=flag+step-1; //flag表示上次坏人的下标
for(int j=flag;j<=tem;j++) { //j是数组下标
if(a[j]!=null) { //表示该位置有之前标记的,不予算
tem++;
}
if(j==tem) { //如果该位置等于目标位置,则标记
a[j]="B";
flag=j+1;
}
if(j==2*T-1) {
tem=tem-2*T;
j=-1;
flag=0;
}
}
}
for(int i=0;i<2*T;i++) {
if(a[i]==null) {
a[i]="G";
}
if((i+1)%50==0) {
System.out.println(a[i]);
}else {
System.out.print(a[i]);
}
}
System.out.println();
System.out.println();
}
}
}