17-12-02(游戏)

思路简单,关键点在于:不论使用何种数据类型,都要注意删除的方式——删除之后所有数据前移一位,这样可能会导致你想删除的数据不在原本的位置。
所以本次采用在一轮遍历中先全部记录要淘汰的人的编号,然后统一淘汰。

import java.util.*;
public class csp_17_12_02 {
    
    
public static void main(String[] args) {
    
    
	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	int k = in.nextInt();
	in.close();
	int number =1;
//ArrayList<Integer> list = new ArrayList();
Map<Integer,Integer> map = new HashMap<>();

for(int i=1;i<=n;i++) {
    
    
//	list.add(i);
	map.put(i, i);
}	
	while(n>1) {
    
    
		int person = n;
		
		//遍历现在的人数
		Map<Integer,Integer> tempmap = new HashMap<>();
		for(Map.Entry<Integer, Integer> T :map.entrySet()) {
    
    		
			if(contain(number,k)) {
    
    
				int j = T.getKey();
				tempmap.put(j, j);
				//System.out.println("记录:"+j+" "+number);
				
			}
			number++;		
		}
		//System.out.print(tempmap);
		int p =1;
		if(tempmap.size()>0)
		for(Map.Entry<Integer, Integer> T :tempmap.entrySet()) {
    
    
			int t = T.getKey();
			//System.out.print("移除:"+t+" "+map.get(t));
			
			map.remove(t);
			p++;
			person--;
			if(person==1) {
    
    
				break;
			}
		}
		//System.out.println();
		n = person;
	}
	for(Map.Entry<Integer, Integer> T :map.entrySet()) {
    
    
	System.out.print(T.getKey());
	}
	//System.out.print(list.get(1));
	
}
public static boolean contain(int number,int k) {
    
    
	char[] c = (number+"").toCharArray();
	if(Character.getNumericValue(c[c.length-1])==k || number%k==0) {
    
    
		return true;
	}
	return false;
}
}

猜你喜欢

转载自blog.csdn.net/qq_51985653/article/details/121456623