1. 程式人生 > >資料結構與演算法書中,字謎遊戲java實現

資料結構與演算法書中,字謎遊戲java實現

看《資料結構與演算法c實現》書中有個字謎遊戲的作業,用java寫了一份,算是完成書中第一章的課後作業吧。

package test;
/**
 * 輸入時一些字母和單次,輸出是找出這些單次
 * 可以橫豎斜,方向任意
 * */
public class PuzzleGame {
 public static void main(String[] args) {
  char[][]a=createTwoDimensionalArray();
  String[] d=dictionary();
  findWord(d, a);
 }
 /**
  * 生成row行,col列的二維陣列
  *
  * */
 public static char[][] createTwoDimensionalArray(){
  char[][] a={{'t','h','i','s'},{'w','a','t','s'},{'o','a','h','g'},{'f','g','d','t'}};
  return a;
 }
 public static String[] dictionary(){
  String [] d={"this","two","fat","that"};
  return d;
 }
 public static void findWord(String[] d,char[][] a){
  for(int i=0;i<d.length;i++){//挨個迴圈查詢詞板裡的單詞
   String word=d[i];
   int len=word.length();//先確定長度
   char firstc=word.charAt(0);//第一個字元
   for(int j=0;j<a.length;j++){//遍歷二維陣列
    for(int k=0;k<a[j].length;k++){//遍歷二維陣列
     if(a[j][k]==firstc){//比較首字母,相等繼續判斷
      compareLenth(len, a, j, k,word,len);
     }else{
      continue;//不等,繼續遍歷
     }
    }
   }
  }
 }
 public static void compareLenth(int lenth,char[][] a,int j,int k,String word,int len){
  int [] lenths=new int[8];//正橫,負橫,正豎,負豎,斜右上,斜左下,斜左上,斜左下   加當前字母,往不同方向可以組成的字母串的最大長度
  lenths[0]=a[0].length-k;//向右
  lenths[1]=k+1;//向左
  lenths[2]=j+1;//向上
  lenths[3]=a.length-j;//向下
  lenths[4]=j+1<a[0].length-k?j+1:a[0].length-k;//斜右上
  lenths[5]=a.length-j<a[0].length-k?a.length-j:a[0].length-k;//斜右下
  lenths[6]=j+1<k+1?j+1:k+1;//斜左上
  lenths[7]=k+1<a.length-j?k+1:a.length-j;//斜左下
  for(int x=0;x<lenths.length;x++){
   if(lenths[x]>=lenth){
    compareWord(x,a,j,k,word,len);
   }else{
    continue;
   }
   
  }
 }
 public static void compareWord(int x,char[][] a,int j,int k,String word,int len){
  String newStr="";
  switch (x) {
  case 0://以[j][k]為原點,正橫向,找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j][k+i]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+j+","+(k+len-1)+")");
   break;
  case 1://以[j][k]為原點,負橫向,找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j][k-i]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+j+","+(k-len+1)+")");
   break;
  case 2://以[j][k]為原點,正豎向(向上),找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j-i][k]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+(j-len+1)+","+k+")");
   break;
  case 3://以[j][k]為原點,負豎向(向下),找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j+i][k]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+(j+len-1)+","+k+")");
   break;
  case 4://以[j][k]為原點,斜右上,找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j-i][k+i]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+(j-len+1)+","+(k+len-1)+")");
   break;
  case 5://以[j][k]為原點,斜右下,找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j+i][k+i]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+(j+len-1)+","+(k+len-1)+")");
   break;
  case 6://以[j][k]為原點,斜左上,找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j-i][k-i]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+(j-len+1)+","+(k-len+1)+")");
   break;
  case 7://以[j][k]為原點,斜左下,找len個字元組成string,與word比較,一樣就輸出結果
   for(int i=0;i<len;i++){
    newStr+=String.valueOf(a[j+1][k-i]);
   }
   if(word.equals(newStr)) System.out.println(word+"位置:("+j+","+ k+")至("+(j+len-1)+","+(k-len+1)+")");
   break;
  default:
   break;
  }
 }
}