数据结构猜字谜游戏(Java语言编写)

    前几年买的一本数据结构与算法分析的书籍, 偶然看到以前有很多题目没有做, 现在抽空来看一下
  • 题目:输入是由一些字母构成的一个二维数组以及一组单词组成。目标是要找出字谜中的单词, 这些单词可能是水平、垂直或者沿对角线任何方向放置的。
  • 思路:首先用广度或者深度都不是一个太理想的方式。因为条件限制, 所以在这里首先将横纵斜以及字符串反向的字符保存, 然后在一一匹配。在时间复杂度上粗略统计也只是平方。
/**
 * 解字谜游戏
 */
public class question_1_2 {

    static final char[][] c = new char[][]{
            {'t', 'h', 'i', 's'},
            {'w', 'a', 't', 's'},
            {'o', 'a', 'h', 'g'},
            {'f', 'g', 'd', 't'}
    };

    static String[] s = {"this", "two", "fat", "that", "sfgs"};
    static int min = c.length;     //最小长度
    static List<String> list = new ArrayList<>();


    public static void a(int minLength){
        for(int i = 0; i < c.length; i++){
            //横向和纵向
            char[] v1 = new char[c[i].length];
            char[] v2 = new char[c[i].length];
            for(int j = 0; j < c[i].length; j++){
                v1[j] = c[i][j];    //横向
                v2[j] = c[j][i];    //纵向
            }
            list.add(String.valueOf(v1));
            list.add(String.valueOf(v2));
            //斜对角
            if(i >= minLength - 1){
                char[] v3 = new char[i + 1];    //左上
                char[] v4 = new char[i + 1];    //左下
                char[] v5 = new char[i + 1];    //右上
                char[] v6 = new char[i + 1];    //右下
                int k = 0, l = i, t = c.length - 1;
                while(l >= 0){
                    v3[k] = c[k][l];
                    v4[k] = c[t][l];
                    v5[k] = c[l][t];
                    v6[k] = c[c.length - l - 1][t];
                    k++;
                    l--;
                    t--;
                }
                b(v3);
                b(v4);
                b(v5);
                b(v6);
            }
        }
    }

    //字符反转
    public static void b(char[] c){
        char[] c2 = new char[c.length];
        int j = 0;
        for(int i = c.length - 1; i >= 0; i--, j++){
            c2[j] = c[i];
        }
        list.add(String.valueOf(c2));
        list.add(String.valueOf(c));
    }

    public static void main(String[] args){
        //找出最小长度
        for (String string : s) {
            if(string.length() < min)
                min = string.length();
        }
        //枚举字谜数组
        a(min);

        //检索是否存在在字谜中
        Set<String> list2 = new TreeSet<>();
        for (String str : list) {
           for(int i = 0; i < s.length; i++){
               if(str.indexOf(s[i]) != -1)
                  list2.add(s[i]);
           }
        }

        for (String s : list2) {
            System.out.print(s + ",");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值