算法竞赛入门经典(第2版)例题4-4信息解码(UVa213)
Scanner的next和hasNext方法用不太好,输入环节有点小问题,直接将变量赋值成编码头和编码文本是可以运行的。
import java.util.Scanner;
/**
*
* @author Joker
*
*/
public class UVa213 {
/**
* 思路:<br/>
* 将编码头放入二维数组,将编码文本放入数组,读取编码文本数组的三个元素,<br/>
* 将其转化为十进制的数ge(“每次读取的个数”),读取ge个元素,将其转化<br/>
* 为十进制的数jm,到bm中查找第(ge-1)行第(jm-1)个。打印输出。<br/>
* 当jm==(2的ge次方-1),读取下三个元素,如果不为0重复上述操作,为0结束操作。
*
* @param sss
* 用来存放编码头
* @param bm
* 将编码头存放到二维数组,行表示其长度,列表示该长度的第几个
* @param ttt
* 存放编码文本
* @param ge
* 存放每次读取的个数
* @param m
* 存放每次读取ge个元素组成的字符串
* @param jm
* 将m转化为二进制
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = "$#**\\";// in.nextLine();
String[] sss = str.split("");
String[][] bm = new String[][] { new String[1], new String[3], new String[7] };
// 将编码头存入二维数组bm
for (int i = 0, j = 0; i < bm.length && j < sss.length; i++)
for (int k = 0; k < bm[i].length && j < sss.length; k++)
bm[i][k] = sss[j++];
str = "0100000101101100011100101000";
// while (in.hasNextInt())
// str += in.next();
String[] ttt = str.split("");
// i为指针,指向当前读到的编码文本的位置
for (int i = 0; i < ttt.length;) {
int ge = Integer.parseInt(ttt[i++] + ttt[i++] + ttt[i++], 2);
if (ge == 0)
break;
String m = "";
for (int j = 0; j < ge; j++)
m += ttt[i++];
int jm = Integer.parseInt(m, 2);
// Math.pow(2,ge) 2的ge次方
while (jm != Math.pow(2, ge) - 1) {
System.out.print(bm[ge - 1][jm]);
m = "";
for (int j = 0; j < ge; j++)
m += ttt[i++];
jm = Integer.parseInt(m, 2);
}
}
}
}