起点 - Java Safecracker程序

时间:2014-09-09 20:51:53

标签: java algorithm

我是一名Java新手,在我们最近被分配的实验室周围遇到了一些麻烦。我希望那里的某个人可以帮助我理解从哪里开始解决这个问题以及一些提示来解决问题 - 注意:我不是要求某人为我编写代码。我只需要一点解释。问题如下:

“这件物品被锁在二楼图书馆一幅画后面的Klein保险箱里.Klein保险箱非常罕见;其中大部分和Klein及其工厂一起在第二次世界大战中被摧毁。幸运的是老Brumbaugh,从研究中,知道克莱因的秘密并在他去世前将其写下来。

Klein safe具有两个显着特征:使用字母而不是数字的组合锁,以及门上的雕刻报价。 Klein报价总是包含5到12个不同的大写字母,通常在句子的开头,并且提到一个或多个数字。五个大写字母组成打开保险箱的组合。通过以适当的方式组合所有数字中的数字,您将获得一个数字目标。 (构建目标号码的细节被分类。)

要查找组合,您必须选择满足以下等式的五个字母vwxyz字母由字母表中的序号位置(A=1, B=2, ..., Z=26)取代。然后组合vwxyz。如果有多个解决方案,则该组合是按字典顺序最大的组合,即在字典中最后出现的组合。“

v - w2 + x3 - y4 + z5 = target

“例如,给定目标1和字母集ABCDEFGHIJKL,一个可能的解决方案是FIECB,因为6 - 92 + 53 - 34 + 25 = 1。在这种情况下实际上有几个解决方案,并且结合了成为LKEBA

Klein认为在雕刻中对组合进行编码是安全的,因为即使你知道秘密,也可能需要数月的努力来尝试所有的可能性。但当然,计算机并不存在。“

=== Op技术指令===
“开发Java程序以找到克莱因组合以准备现场部署。根据部门规定使用标准测试方法。输入包含一行或多行,其中包含一个小于一千二百万的正整数目标,一个空格,然后至少五个,在大多数十二个不同的大写字母。最后一行包含一个零目标和字母END;这​​表示输入结束。对于每一行输出唯一的Klein组合,如果没有正确的组合,则为“无解”。确切的格式如下所示。“

示例输入:

1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END

示例输出:

LKEBA 
YOXUZ 
GHOST 
no solution 

教授潦草地写下了一些代码,但我只是很难理解它 - 具体如下:

package lab2;
import java.util.Arrays;

public class Lab2 {
    public static void main(String[] args) {
        public static final int MAX_LETTERS = 12;
        public static final int MIN_LETTERS = 5;
        private String best; //best solution;
        private int key;   // number in input file
        private int codes;   // number of letters in code
        int [] k = new int [MAX_LETTERS];  //holds numeric codes
        public boolean is_solution (int u, int v, int x, int x, int y){  //compute the equation, test if it equals to key, return true or false
        }//is_solution
        public void test_combinations(int start){
            int i;
            if (start == MIN_LETTERS){
                if (is_solution(k[0], k[1], k[2], k[3], k[4])){
                    char[] s = new char[5];
                    s[0] = (char) (k[0] + 'A' - 1);
                    s[1] = (char) (k[1] + 'A' - 1);
                    s[2] = (char) (k[2] + 'A' - 1);
                    s[3] = (char) (k[3] + 'A' - 1);
                    s[4] = (char) (k[4] + 'A' - 1);
                    String sol = Arrays.toString(s);
                    System.out.println("\n Found a Solution " + sol);
                    if (sol.compareTo(best) > 0)
                        best = sol;
                }//close if is_solution
            }//if start
            else{
                for (i = start; i<codes; i++){
                    temp = k[start];
                    k[start] = k[i];
                    k[i] = temp;
                    test_combinations(start+1);
                    k[i] = k[start];
                    k[start] = temp;
                }//close for
            }//close else
        }//test_combinations

        public lab2(){
            //file
            //try/catch
            //inside try: read key, read code in a loop - WHILE.HASNEXT
            //test if(key == 0), break
            //test code.lenth is between 5 & 12, if not, break
            //set best to "@@@@@@@"
            //convert all characters to ordinal values, store them in array k - SUBTRACT 'A' ADD 1 - CHAR.AT
            charAt(i)-'A'+1 ______ k[i] (assign to)
                test_combinations(0);
            //output best
            //close file
        }//lab2
    }
}

2 个答案:

答案 0 :(得分:0)

你错过了一个For循环来将你的chars转换为一个正常值来存储到数组k中。这应该有所帮助,所以它是

  

if(codeLength&gt; 5&amp;&amp; codeLength&lt; 12){

     
    

for(int i; i&lt; codeLength; i ++){

         
      

k [i] = charAt(i) - 'A'+ 1;

    
  

我还没弄清楚要在while循环括号中放什么,但我正在研究它。

答案 1 :(得分:0)

更正的Lab2()代码如下:

    public Lab2() {
    File Safe = new File("Safe.txt");
    try {
        Scanner input = new Scanner(Safe);
        while (input.hasNext()) {
            key = input.nextInt();
            String s = input.next();
            if (key == 0){
                break;
            }            
            if (s.length() < 5 || s.length() > 12){
                break;
            }
            for (int i = 0; i < s.length(); i++) {
                k[i] = s.charAt(i) - 'A' + 1;
            }                  
            codes = s.length();
            //System.out.printf("Key %d, letters %s (%d) \n," key, s, codes);  
            best = ("@@@@@");//set best to "@@@@@@@"          
            test_combinations(0);
            if (best.equals("@@@@@")) {
                System.out.println("No solution.");
            }
                else {
                System.out.println("Best solution: " + best);
            }
        }
    }
    catch (IOException e) {
        e.printStackTrace();
        System.out.println("Execute this.");
    }
}