------- android培训、java培训、期待与您交流! ----------
———————————————————————————————————————————————
题目:赛利有12枚银币,其中11枚真币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利3次就能找出假币并且确定假币是轻还是重。例如,如果赛利用天平称两枚硬币,发现天平平稀,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。请经过精心安排每次的称量,希望赛利按照您的策略称3次后确定假币。赛利事先将银币标号为A-L,其中平衡状态用“up”、“down”或“even”表示,分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。输出哪一个标号的银币是假币,并说明它比真币轻还是重。样例输入1ABCD EFGH evenABCI EFJK upABIJ EFGH even样例输出K为假币,比真币轻.abcd efgh evenabci efjk upabij efgh even
package com.jie.act;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class TrueFalseCoin {
public static void main(String []args){
String []str1 = null;
String []str2 = null;
String []str3 = null;
System.out.println("输入的必须是标号为A-L,示例输入:"+"\r\n"+"abcd efgh even");
for (int i = 0; i < 3; i++) {
if (i==0) {
System.out.println("请输入第一次的结果:");
str1 = inmethod();
}else if (i==1) {
System.out.println("请输入第二次的结果:");
str2 = inmethod();
}else {
System.out.println("请输入第三次的结果:");
str3 = inmethod();
}
}
String strinfo = disCoins(str1,str2,str3);
System.out.println(strinfo);
}
public static String disCoins(String[] str1, String[] str2, String[] str3) {
if(str1.length !=3||str2.length !=3||str3.length !=3){
throw new RuntimeException("输入错误");
}
if (str1.length != str2.length) {
throw new RuntimeException("前两个硬币个数应该相等。输入错误");
}
// 设置一个记录假的银币
char retValch = 0 ;
String tf = null;
Set<Character> set = new HashSet<Character>();
// 先将even的所有元素添加到集合中
String []laststr = {str1[2],str2[2],str3[2]};
// 判断哪个是even的
for (int i = 0; i < laststr.length; i++) {
if(laststr[i].equalsIgnoreCase("even")){ //必须把所有even的元素都添加到集合中
// 如果是0元素就是str1的
if(i==0){
for (int j = 0; j < 2; j++) {
char []chs = str1[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
set.add(chs[k]);
}
}
}
if (i==1) {
for (int j = 0; j < 2; j++) {
char []chs = str2[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
set.add(chs[k]);
}
}
}
if(i==2){
for (int j = 0; j < 2; j++) {
char []chs = str3[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
set.add(chs[k]);
}
}
}
}
}
for (int i = 0; i < laststr.length; i++) {
if(!laststr[i].equalsIgnoreCase("even")){
if (i==0) {//第一次的硬币中有假币
for (int j = 0; j < 2; j++) {
char []chs = str1[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
if(!set.contains(chs[k])){
retValch = chs[k];
tf = reqHT(laststr, i, j);
}
}
}
}
if (i==1) {//第二次的硬币中有假币
for (int j = 0; j < 2; j++) {
char []chs = str2[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
if(!set.contains(chs[k])){
retValch = chs[k];
tf = reqHT(laststr, i, j);
}
}
}
}
if (i==2) {//第三次的硬币中有假币
for (int j = 0; j < 2; j++) {
char []chs = str3[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
if(!set.contains(chs[k])){
retValch = chs[k];
tf = reqHT(laststr, i, j);
}
}
}
}
}
}
if (set.size()<10) {
throw new RuntimeException("无法获得结果");
}
return "假币是"+retValch+tf;
}
public static String reqHT(String[] laststr, int i, int j) {
String tf;
if(laststr[i].equalsIgnoreCase("up")){ //右边高
if(j==1)//并且假币在右边
tf = "假币轻";
else {
tf = "假币重";
}
}
else { //右边低
if (j==1) { //假币在右边
tf = "假币重";
}
else {
tf = "假币轻";
}
}
return tf;
}
public static String[] inmethod() {
String readline = input(System.in);
String []strs = null;
if(readline !=null){
//将输入的信息进行切割
strs= splitReadLne(readline);
}
return strs;
}
public static String[] splitReadLne(String readline) {
//设置一个变量记录空格出现的索引值
int index = 0;
//设置一个数组,因为长度不确定,将它设置为str的长度
String []arr_str = new String[readline.length()];
//arr_str的长度不确定,为了将不需要的null去掉,所以设置了arr_str2数组
String []arr_str2 =null;
//为了将数据存储到arr_str中,定义一个变量
int p = 0;
while(((index = readline.indexOf(" ")))!=-1){ //当索引值不是空的时候循环(字符串中有空格)
if(index == 0){
/*
* 如果得到的字串中第一个字符还是空格,就接着更新
空20空空29空8 index = 0,就从1开始取后边的所有的数。
得到20空空29空8 index = 3!=0.
将20取出来放到一个数组里去,并且将去除20后的字符串更新
*/
readline = readline.substring(1, readline.length());
}else{
arr_str[p++] = readline.substring(0,index);
readline = readline.substring(index+1, readline.length());
}
}
//到这里肯定还有一个数,直接添加到数组中去
arr_str[p] = readline;
int mark = 0; //得到了一个含有多个null的数组。
for (int i = 0; i < arr_str.length; i++) {
//将第一次出现null元素的位置记录,这个位置就是数组所需要的实际长度
//跳出循环。得到最小长度
if(arr_str[i] == null){
mark = i;
break;
}
}
arr_str2 = new String[mark]; //长度确定了,就可以直接new对象了
for(int i = 0;i<mark;i++){
arr_str2[i] = arr_str[i];
}
//String arr_str[] = str.split(" ");
return arr_str2;
}
/**
* 三次就可以得到结果
* 不知道假硬币比真硬币轻还是重
*/
public static String input (InputStream in){
//为了方便,将键盘输入的字节使用转换流进行转换
BufferedReader bufr = new BufferedReader(new InputStreamReader(in));
String line = null;
try {
line = bufr.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (line !=null) {
return line;
}
return null;
}
}