POJ1013假币问题

突然想起自己

直接上代码,代码的注释有自己思考的过程

package Work2;
import java.util.Scanner;
/*
思路:
同样,既然是采用枚举法,那么就不要想的那么复杂.
按照ppt 上的思路,分两种情况讨论.
对于每一枚硬币假设.如果符合称量结果,那么问题解决
情况一:假币是轻的
情况二:假币是重的

需要的变量有
第一次左边的硬币 第一次右边的硬币 第一次的结果
第二次左边的硬币 第二次右边的硬币 第二次的结果
第三次左边的硬币 第三次右边的硬币 第三次的结果

假设硬币是轻还是重,并且来判断3次的结果是否符合.
以及对硬币的循环,用到数组,恰好数组下标可以对应字母A~L.
数组的初始化全部为0.假币-1表示轻,假币+1表示重.

首先对输入的数据进行存储,然后进行循环,for(int i=0;i<12(arr.length);i++)
arr[i]=0/1/-1,然后开始3次的内部循环,根据左边的硬币和右边的硬币来对应每一次的结果,
并且和输入的数据进行比较,来返回一个值.如果3次都符合,那么输出结果,否则i++,做下一次判断.

对于3次内部的循环,关于如何由左边的硬币和右边的硬币来判断每一次的结果
左边的硬币的获取是一个字符串 比如ABCD,我们可以写一个查询的函数,(String str,int i)
来根据i来返回str中对于下标的权值,假如是A,首先我们需要获取他的位置str.charAt(i)可以得到这个字符,
然后根据这个字符来返回数组中元素的下标,然后在权值数组中得到权值.

那么总结一下需要写的函数有哪些
1,查询函数1:根据给出的字符,返回其在数组中的下标
2,查询函数2:根据给出的字符,返回其权值,这里需要使用查询函数1
3,得到权值的和函数:利用查询函数2,进行一个循环,来得到硬币的权值和
4,比较函数,根据左右两边硬币权值的和来得到结果并且与输入预期相比较,返回一个boolean值

 */
public class CoinQuestion2 {
	/*
	 * 查询函数,给出字符得到下标
	 */
	public static int getNum(char[] arr,char value) {
		int temp=-1;
		for(int i=0;i<arr.length;i++) {
			if(value==arr[i])
				temp=i;
		}	
		return temp;
	}
	/*
	 * 查询函数2,给出位置,返回权值
	 */
	public static int getWeight(String str,int i,char[] arr,int[] coinWeight) {
		 int temp=getNum(arr, str.charAt(i));
		return coinWeight[temp];
	}
	/*
	 * 得到权值和的函数
	 */
	public static int getWeightCombine(String str,char[] arr,int[] coinWeight) {
		int temp=0;
		for(int i=0;i<str.length();i++) {
			temp=temp+getWeight(str, i, arr, coinWeight);
		}
		return temp;
	}
	/*
	 * 比较函数,由左右两个Coin的结果,得到一个Result,然后与预期的Result相比较,得到一个返回值
	 */
	public static Boolean getResult(String[] exp,char[] arr,int[] coinWeight) {
		int resultLeft=getWeightCombine(exp[0], arr, coinWeight);
		int resultRight=getWeightCombine(exp[1], arr, coinWeight);
		Boolean temp = false;
		if(resultLeft<resultRight) { 
			temp="down".equals(exp[2]);
		}else if(resultLeft>resultRight) {
			temp="up".equals(exp[2]);
		}else if(resultLeft==resultRight) {
			temp="even".equals(exp[2]);
		}
		return temp;
	}
	public static void main(String[] args) {
		// 定义硬币数组,用于存放每一枚硬币
		char[] coin = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L' };
		// 定义硬币的权值数组,0-11对应A-L每一枚硬币
		/*
		 * 假币权值可能为1或者-1,1表示重的,-1表示轻的 正常硬币的权值均为0
		 */
		int level = 1;
		int[] coinWeight = new int[12];
		for(int i=0;i<12;i++) {
			coinWeight[i]=5;
		}
		@SuppressWarnings("resource")
		Scanner scanner= new Scanner(System.in);
		int count=scanner.nextInt();
		String[] result=new String[count];
		String[][][] expx=new String[count][3][3];
		for(int x=0;x<count;x++) {
			for(int i=0;i<3;i++)
				for(int j=0;j<3;j++)
						expx[x][i][j]=scanner.next();
		}
		for(int x=0;x<count;x++) {
			//情景一,假设A-L中每一枚硬币先定义它是轻的,令权值为0
			for(int i=0;i<coinWeight.length;i++) {
				coinWeight[i] = 0;
				level = 1;
				Boolean boolean1=getResult(expx[x][0], coin, coinWeight);
				Boolean boolean2=getResult(expx[x][1], coin, coinWeight);
				Boolean boolean3=getResult(expx[x][2], coin, coinWeight);
				if(boolean1&&boolean2&&boolean3) {
					result[x]=coin[i]+" is the counterfeit coin and it is light.";
					level = 2;
					break;
				}
				coinWeight[i] = 5;
			}
			
			//情景二,假设A-L中每一枚硬币先定义它是重的,令权值为10
			if(level == 1) {
				level = 1;
			for(int i=0;i<coinWeight.length;i++) {
				coinWeight[i] = 10;
				Boolean boolean1=getResult(expx[x][0], coin, coinWeight);
				Boolean boolean2=getResult(expx[x][1], coin, coinWeight);
				Boolean boolean3=getResult(expx[x][2], coin, coinWeight);
				if(boolean1&&boolean2&&boolean3) {
					result[x]=coin[i]+" is the counterfeit coin and it is heavy.";
					break;
				}
				coinWeight[i] = 5;
			}
			}
		}
		for(int x=0;x<count;x++) {
			System.out.println(result[x]);
		}
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值