数据结构与算法书中,字谜游戏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;
  }
 }
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值