ACM斗牛游戏算法JAVA实现

题目描述

在中国传统的牌类游戏中蕴含了很多有意思的数学问题,斗牛就是一种有趣的扑克牌游戏,参与斗牛的玩家每回合会得到五张扑克牌,每张牌可能是A、2、3、4、5、6、7、8、9、10 、J、 Q、 K中的任意一张,这些牌分别代表一个数,就是其本身,对于特殊的牌,我们规定A代表1,J、Q、K和10是等价的,玩家拿到五张牌后,可以任意取三张牌,如果三张牌的点数相加为10或者10的倍数(比如20或者30),即说明该玩家有牛。在有牛的前提下,剩下的两张牌相加即为玩家的最终点数,点数总共有牛1、牛2…牛10这样十种情况,点数越大越好(即牛1最小,牛10最大),两张牌的点数相加若超过10,则只取个位数,比如 3和8,则该玩家点数为牛1。如果构成10或者10的倍数,即都视为牛10,比如 5和5、10和10、10和J,这三种情况均为牛10。
为了简化题目输入输出,我们只取1到10这10种数值的牌。此外,为了增加游戏的趣味性,我们增加鬼牌,拿到鬼牌的玩家可以将其作为1-10之间的任意点数的牌,在题目中,用0来表示鬼牌。

输入

输入的第一行包含一个整数 T ( T > 0),表示一共有 T组测试数据。
对于每组测试数据,只有一行,包含五个整数a,b,c,d,e (0<=a,b,c,d,e<=10),数字之间用空格分开。

输出

对于每组测试数据,若玩家没有牛,则输出-1,若玩家有牛,输出一个正整数代表玩家能够凑成的最大点数。

样例输入
5
3 5 1 4 8
4 8 8 3 6
3 7 1 4 1
0 2 5 6 7
0 2 5 3 7


样例输出
1
9
-1
9
10

实现代码:

package ACM;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class BlueGame {

private int T;
private String temp;
private static int N =10;
List result =new ArrayList();


/**
* @param args

* @author TD_LSW
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BlueGame b = new BlueGame();
b._blue();
 
}


private void _blue() {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
T = in.nextInt();
System.out.println("請按照a b c d e(0<=a,b,c,d,e<=10)格式輸入!");//比如0 1 3 4 5
for (int i = 0; i < T; i++) {
Scanner out = new Scanner(System.in);
temp = out.nextLine();
String[] strs = temp.split(" ");//将输入的数字按空格分割
List data =new ArrayList();
//将输入的数字存入List方便计算
for(int j=0; j data.add(Integer.parseInt(strs[j]));
}
//斗牛算法
_is_Blue(data,N,i);
}

}


/**

* @param data 数字List
* @param n 10
* @param c 输出标志位
*/

private void _is_Blue(List data, int n,int c) {
// TODO Auto-generated method stub
int count = 0;
//判断是否存在0,并且存在两个0以上一定是牛十后面不需判断
for(int i =0;i if(data.get(i) == 0){
count++;
data.remove(i);
if(count>1){
result.add(n);
break;
}
}
}
//List中有一个0时一定有牛
if(data.size()==4){
int td = 0;
//判断是否牛十
for(int x=0;x<3;x++){
for(int y=x+1;y<4;y++){
if((data.get(x)+data.get(y))%n==0){
result.add(n);
}else{
td = getMax(data);//计算最大牛
}
}
}
//若不是牛十,则输出最大牛
if(td<10){
result.add(td);
}
}
//不存在0时
if(data.size()==5){
int temp =0;
int r = -1;//是否有牛标志
//斗牛算法
for(int x=0;x<3;x++){
for(int y=x+1;y<4;y++){
for(int z=y+1;z<5;z++){
if((data.get(x)+data.get(y)+data.get(z))%n==0){
for(int j=0;j if(j!=x&&j!=y&&j!=z){
temp += data.get(j);
}
}
//若有牛,且剩下的两个数也是牛十
if(temp%n==0){
r = n;
}
//若有牛,剩下的不是牛十
else{
r = temp%n;
}
result.add(r);
}
}
}
}
//没有牛
if(r==-1){
result.add(r);
}
}
//输出
if(c==T-1){
for(int p=0;p System.out.println(result.get(p));
}
}

}


/**
* 获得最大牛
* @param tempData
* @return
*/
private int getMax(List tempData) {
// TODO Auto-generated method stub
int temp = (tempData.get(0)+tempData.get(1))%10;
for(int n=0;n for(int m=n+1;m if((tempData.get(n)+tempData.get(m))%10 >= temp){
temp = (tempData.get(n)+tempData.get(m))%10 ;
}
}
}
return temp;
}




}

你可能感兴趣的:(算法,ACM)