算法竞赛入门经典(第2版)例题4-4信息解码(UVa213)

算法竞赛入门经典(第2版)例题4-4信息解码(UVa213)

Scanner的next和hasNext方法用不太好,输入环节有点小问题,直接将变量赋值成编码头和编码文本是可以运行的。

import java.util.Scanner;

/**
 * 
 * @author Joker
 *
 */
public class UVa213 {
    /**
     * 思路:
* 将编码头放入二维数组,将编码文本放入数组,读取编码文本数组的三个元素,
* 将其转化为十进制的数ge(“每次读取的个数”),读取ge个元素,将其转化
* 为十进制的数jm,到bm中查找第(ge-1)行第(jm-1)个。打印输出。
* 当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); } } } }

你可能感兴趣的:(算法)