背景: 因为个人喜欢玩三国杀,又非常喜欢张昌蒲这个武将,所以闲暇之余写了一个张妈严教技能计算的代码,请各位朋友指正
技能: 张妈的严教技能简单来说就是,可以亮出4-10张1-13点数的牌,把这些牌分成点数之和相等的两组,你与张昌蒲各获得其中一组
思路: 从张妈技能可以看出拿牌涉及点数之和计算,且拿牌的数量不定,所以可以延伸出很多拿牌组合,这里把所有组合都展示出来(注意:你和张昌蒲把牌反过来拿的不展示,正反拿牌只展示一种组合)
这里给出两种设计思路:
一)一次处理,把所有严教牌的所有点数之和的可能,全部列出来,从中找出点数相同的牌
二)分类处理,严教的拿牌可能无非有三种情况,1对1拿牌,多对1拿牌(1对多同理),多对多拿牌,所以能拿的分三种单独处理,从中找出点数相同的牌
两种代码我都实现了,严教拿牌组合也相同,这里只展示思路一的代码
代码展示:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入严教牌的数量(4-10):");
int num = scanner.nextInt();
if(num > 10 || num < 4){
System.out.println("输入严教牌的数量有误,应输入4-10之间!");
return;
}
System.out.println("请输入" + num + "个严教牌点数(点数1-13):");
List<Integer> list = new ArrayList<Integer>();
for(int i = 0 ; i < num ; i++){
System.out.print("第" + (i+1) + "个严教牌:");
int key = scanner.nextInt();
if(key > 13 || key < 1){
System.out.println("输入严教牌的点数有误,应输入1-13之间!");
return;
}
list.add(key);
}
Collections.sort(list);
System.out.println("严教牌排序(从小到大):" + list.toString());
Map<String,Integer> map = new HashMap<String,Integer>();
// 排列出所有点数之和的可能
for(int i = 0 ; i < list.size() ; i++) {
int ivalue = list.get(i);
String ikey = ivalue + "[" + i + "]";
if(!map.containsKey(ikey)){
map.put(ikey,ivalue);
}
for (int m = i + 1; m < list.size(); m++) {
int imvalue = list.get(i);
int mvalue = list.get(m);
imvalue += mvalue;
String mkey = ikey + "," + mvalue + "[" + m + "]";
if(!map.containsKey(mkey)){
map.put(mkey,imvalue);
}
for (int j = m + 1; j < list.size(); j++) {
int jmvalue = imvalue;
int jvalue = list.get(j);
jmvalue += jvalue;
String jkey = mkey + "," + jvalue + "[" + j + "]";
if(!map.containsKey(jkey)){
map.put(jkey,jmvalue);
}
}
}
}
int total = 0;
Map<String,String> map2 = new HashMap<String,String>();
for(Map.Entry<String, Integer> entry : map.entrySet()){
String key = entry.getKey();
int value = entry.getValue();
List<String> keyList = Arrays.asList(key.split(","));
for(Map.Entry<String, Integer> entry2 : map.entrySet()){
String key2 = entry2.getKey();
int value2 = entry2.getValue();
boolean flag = true;
// 排除点数之和相同的两组存在同一元素
for(String str : keyList){
if(key2.contains(str)){
flag = false;
break;
}
}
if(flag){
// 排除重复数据
if((!key.equals(key2)) && value == value2){
// 排除正反拿牌
if(!((map2.containsKey(key) && key2.equals(map2.get(key))) || (map2.containsKey(key2) && key.equals(map2.get(key2))))){
total++;
System.out.println("严教组合" + total + ":");
System.out.println("严教牌(你):" + key);
System.out.println("严教牌(张昌蒲):" + key2);
System.out.println("");
map2.put(key, key2);
}
}
}
}
}
结果展示:
中括号内是严教牌排序后的下标(从0开始),因为可能存在相同点数但属于不同的牌,所以同点数也要考虑成不同组合
测试结果展示一:
请输入严教牌的数量(4-10):5
请输入5个严教牌点数(点数1-13):
第1个严教牌:10
第2个严教牌:5
第3个严教牌:8
第4个严教牌:3
第5个严教牌:2
严教牌排序(从小到大):[2, 3, 5, 8, 10]
严教组合1:
严教牌(你):10[4]
严教牌(张昌蒲):2[0],8[3]
严教组合2:
严教牌(你):10[4]
严教牌(张昌蒲):2[0],3[1],5[2]
严教组合3:
严教牌(你):2[0],8[3]
严教牌(张昌蒲):10[4]
严教组合4:
严教牌(你):2[0],3[1]
严教牌(张昌蒲):5[2]
严教组合5:
严教牌(你):5[2],8[3]
严教牌(张昌蒲):3[1],10[4]
严教组合6:
严教牌(你):8[3]
严教牌(张昌蒲):3[1],5[2]
测试结果展示二:
请输入严教牌的数量(4-10):7
请输入7个严教牌点数(点数1-13):
第1个严教牌:7
第2个严教牌:2
第3个严教牌:13
第4个严教牌:7
第5个严教牌:6
第6个严教牌:1
第7个严教牌:10
严教牌排序(从小到大):[1, 2, 6, 7, 7, 10, 13]
严教组合1:
严教牌(你):6[2],7[3]
严教牌(张昌蒲):1[0],2[1],10[5]
严教组合2:
严教牌(你):6[2],7[3]
严教牌(张昌蒲):13[6]
严教组合3:
严教牌(你):6[2],10[5]
严教牌(张昌蒲):1[0],2[1],13[6]
严教组合4:
严教牌(你):6[2],10[5]
严教牌(张昌蒲):2[1],7[3],7[4]
严教组合5:
严教牌(你):7[3]
严教牌(张昌蒲):1[0],6[2]
严教组合6:
严教牌(你):7[3]
严教牌(张昌蒲):7[4]
严教组合7:
严教牌(你):1[0],6[2]
严教牌(张昌蒲):7[3]
严教组合8:
严教牌(你):1[0],6[2]
严教牌(张昌蒲):7[4]
严教组合9:
严教牌(你):1[0],7[3]
严教牌(张昌蒲):2[1],6[2]
严教组合10:
严教牌(你):10[5]
严教牌(张昌蒲):1[0],2[1],7[4]
严教组合11:
严教牌(你):10[5]
严教牌(张昌蒲):1[0],2[1],7[3]
严教组合12:
严教牌(你):1[0],2[1],7[4]
严教牌(张昌蒲):10[5]
严教组合13:
严教牌(你):1[0],13[6]
严教牌(张昌蒲):7[3],7[4]
严教组合14:
严教牌(你):1[0],2[1],10[5]
严教牌(张昌蒲):6[2],7[3]
严教组合15:
严教牌(你):1[0],2[1],10[5]
严教牌(张昌蒲):6[2],7[4]
严教组合16:
严教牌(你):1[0],2[1],10[5]
严教牌(张昌蒲):13[6]
严教组合17:
严教牌(你):1[0],7[3],7[4]
严教牌(张昌蒲):2[1],13[6]
严教组合18:
严教牌(你):1[0],7[4]
严教牌(张昌蒲):2[1],6[2]
严教组合19:
严教牌(你):2[1],7[3],10[5]
严教牌(张昌蒲):6[2],13[6]
严教组合20:
严教牌(你):2[1],7[4],10[5]
严教牌(张昌蒲):6[2],13[6]
严教组合21:
严教牌(你):6[2],7[4]
严教牌(张昌蒲):1[0],2[1],10[5]
严教组合22:
严教牌(你):6[2],7[4]
严教牌(张昌蒲):13[6]
严教组合23:
严教牌(你):1[0],2[1],13[6]
严教牌(张昌蒲):6[2],10[5]
以上并未进行详细测试,请各位网友指正~~