資料結構與演算法書中,字謎遊戲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;
}
}
}