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]);
}
}
}
上一篇: php 表单提交实例代码
下一篇: V$ASM_OPERATION
推荐阅读
-
代码详解ios键盘收起问题
-
解决ios微信下vue项目组件切换并自动播放音频问题
-
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
-
mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
-
Python代码解决RenderView窗口not found问题
-
完美解决关于禁止ViewPager预加载的相关问题
-
针对PHP开发安全问题的相关总结
-
iOS10 App适配权限 Push Notifications 字体Frame 遇到的问题
-
iOS10适配之权限Crash问题的完美解决方案
-
Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)