「編寫一個程式求解字迷遊戲問題」 《數據結構與演算法分析 Java語言描述》課後習題1.2

2020-08-14 11:06:38

「編寫一個程式求解字迷遊戲問題」

  • 問題描述:輸入一些由字母構成的二維陣列,以及一些由單詞組成的一維陣列,目標是在二維陣列中找出能夠組成一維陣列中的單詞的元素。此問題稱爲:解字謎(英文版);
  • 問題思路:對一維陣列進行處理,將單詞轉化爲char陣列,在二維陣列中對char陣列進行有序匹配,儲存匹配成功元素的下標到結果集,過程通過遞回及回圈配合處理。

程式碼如下:

public static void work1_2() {
        /*
        1.2
        解字迷
         */
        String[][] index = new String[4][4];//結果集
        //呼叫方法
        findIndex(index, 0, 0);
        //輸出結果
        for (int i = 0; i <index.length ; i++) {
            System.out.println(i);
            for (String s:index[i]) {
                if (s!=null)System.out.print(s+"\t");
            }
            System.out.println();
        }
        
    }

    public static String[][] findIndex(String[][] index, int i, int n) {
    //使用遞回對所要找的單詞進行分析匹配
    /*
    	1.將目標單詞進行charArray拆分
    	2.遞回對charArray陣列分別匹配,匹配成功則儲存座標到結果集index
    */
        String[] targetList = {"this", "two", "fat", "that"};//目標集
        char[][] charArea = {{'t', 'h', 'i', 's'}, {'w', 'a', 't', 's'}, {'o', 'a', 'h', 'g'}, {'f', 'g', 'd', 't'}};//匹配域
        if (i == 4) return index;
        char[] chars = targetList[i].toCharArray();
        for (int j = 0; j < charArea.length; j++) {
            for (int k = 0; k < charArea[j].length; k++) {
                if (charArea[j][k] == chars[n]) {
                    index[i][n] ="("+ (j+1)+ "," + (k+1)+")";
                    n++;
                    if (n == targetList[i].length()) {
                        i++;
                        n = 0;
                    }
                    return findIndex(index, i, n);
                }
            }
        }
        return index;
    }