欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ1013假币问题

程序员文章站 2022-05-13 17:13:02
...

突然想起自己

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

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]);
		}
	
	}
}