`
lixuanbin
  • 浏览: 137697 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

蛮力法解字谜游戏

阅读更多

时差爆发,睡不着,闲的蛋疼。。。思路写在注释里,直接撸代码:

import java.util.*;  
public class WordPuzzle {  
    private char[][] puzzle;  
    private List<String> wordList;  
    public WordPuzzle(char[][] puzzle, List<String> wordList) {  
        this.puzzle = puzzle;  
        this.wordList = wordList;  
    }

    /** 
     * Solve the puzzle.<br/> 
     * result: {beginIndex(row, column);endIndex(row, column);matchWord}<br/> 
     * temp tuple: {beginIndex(row,column);endIndex(row,column);direction;composedChars2String}<br/>
     * Procedure:<br/> 
     * for each element in the puzzle {<br/> 
     *     construct a tuple;<br/> 
     *     check word list and see whether there is a match;<br/> 
     * }
     */  
    public List<String> solvePuzzle() {  
        List<String> resultList = new LinkedList<String>();  
        List<String> tupleList = null;  
        String tempResult = null;  
        String[] strings = null;  
        for(int i = 0; i < puzzle.length; i++) {  
            for(int j = 0; j < puzzle[i].length; j++) {  
                tupleList = findAllString(i, j);
                System.out.println("Tuple list constructed.");
                for(String temp : tupleList) {
                    System.out.println(temp);
                    if(temp != null) {
                        strings = temp.split(";");
                        System.out.println("judging " + strings[0]);
                        if(wordList.contains(strings[0])) {
                            tempResult = "(" + i + "," + j + ");" + strings[1] + ";" + strings[0];
                            resultList.add(tempResult);
                        }
                    }
                } 
            } 
        }
        Iterator<String> iterator = resultList.iterator();
        String temp = null;
        while(iterator.hasNext()) {
            temp = iterator.next();
            if(temp == null || "null".equals(temp)) {
                iterator.remove();
            }
        }
        return resultList;
    }  

    /** 
     * Find all possible composed strings and return as a list along with the end index.<br/> 
     * eg. {string;(row,column)} 
     */
    private List<String> findAllString(int beginRow, int beginColumn) {
        List<String> resultList = new LinkedList<String>();
        List<String> tempList = null;
        if(beginColumn < puzzle[beginRow].length - 1) {
            tempList = findAllRow(beginRow, beginColumn);
            appendList(resultList, tempList);
            tempList.clear();
        }
        if(beginColumn < puzzle.length - 1) {
            tempList = findAllColumn(beginRow, beginColumn); 
            appendList(resultList, tempList);
            tempList.clear();
        }
        if((beginColumn < puzzle.length - 1) && (beginColumn < puzzle[beginRow].length - 1)) {
            tempList = findAllDiagonal(beginRow, beginColumn); 
            appendList(resultList, tempList);
            tempList.clear();
        }
        return resultList; 
    }

    /**
     * Appends each element form the src list to the destination list.
     */
    public <T> void appendList(List<T> dest, List<T> src) {
        for (T temp : src) {
            dest.add(temp);
        }
    }

    /**
     * Find all possible composed words in the same row starting at a given index.
     */ 
    private List<String> findAllRow(int i, int j) {
        List<String> tempWords = new LinkedList<String>();
        StringBuilder sb = new StringBuilder(); // Hold the words and their indexes.
        StringBuilder sbw = new StringBuilder(); // Hold the composed words.
        if(j < puzzle[i].length - 1) {
            sbw.append(puzzle[i][j]);
            for(int a = j + 1; a < puzzle[i].length; a++) {
                sbw.append(puzzle[i][a]);
                sb.append(sbw.toString()).append(";(")
                    .append(i).append(',').append(a).append(')');
                System.out.println(sbw.toString());
                System.out.println(sb.toString());
                tempWords.add(sb.toString());
                sb.delete(0, sb.length()); // Empty the sb.
            }
        }
        return tempWords;
    }

    /**
     * Find all possible composed words in the same column starting at a given index.
     */
    private List<String> findAllColumn(int i, int j) {
        List<String> tempWords = new LinkedList<String>();
        StringBuilder sb = new StringBuilder(); // Hold the words and their indexes.
        StringBuilder sbw = new StringBuilder(); // Hold the composed words.
        if(i < puzzle.length - 1) {
            sbw.append(puzzle[i][j]);
            for(int a = i + 1; a < puzzle.length; a++) {
                sbw.append(puzzle[a][j]);
                sb.append(sbw.toString()).append(";(")
                    .append(a).append(',').append(j).append(')');
                System.out.println(sbw.toString());
                System.out.println(sb.toString());
                tempWords.add(sb.toString());
                sb.delete(0, sb.length()); // Empty the sb.
            }
        }
        return tempWords;
    }


    /**
     * Find all possible composed words in the diagonal starting at a given index.
     */
    private List<String> findAllDiagonal(int i, int j) {
        List<String> tempWords = new LinkedList<String>();
        StringBuilder sb = new StringBuilder();
        StringBuilder sbw = new StringBuilder();
        if(i < puzzle.length - 1 && j < puzzle[i].length - 1) {
            sbw.append(puzzle[i][j]);
            for(int a = i + 1, b = j + 1; a < puzzle.length && b < puzzle[a].length; a++, b++) {
                sbw.append(puzzle[a][b]);
                sb.append(sbw.toString()).append(";(")
                    .append(a).append(',').append(b).append(')');
                System.out.println(sbw.toString());
                System.out.println(sb.toString());
                tempWords.add(sb.toString());
                sb.delete(0, sb.length()); // Empty the sb.
            }
        }
        return tempWords;
    }

    public static void main(String[] args) {
        List<String> dictionary = new ArrayList<String>();
        Collections.addAll(dictionary, new String[]{"dad", "cat", "sad", "sat", "bad"});
        char[][] myPuzzle = new char[4][4];
        myPuzzle[0] = new char[] {'i', 'd', 'a', 'd'};
        myPuzzle[1] = new char[] {'w', 's', 'a', 'd'};
        myPuzzle[2] = new char[] {'v', 'b', 'a', 'd'};
        myPuzzle[3] = new char[] {'z', 'c', 'a', 't'};
        WordPuzzle wp = new WordPuzzle(myPuzzle, dictionary);
        List<String> results = wp.solvePuzzle();
        System.out.println("the result is: ");
        for(String temp : results) {
            System.out.println(temp);
        }
    }
}

 

运行结果:

the result is:
(0,1);(0,3);dad
(0,1);(2,3);dad
(1,1);(1,3);sad
(1,1);(3,3);sat
(2,1);(2,3);bad
(3,1);(3,3);cat

 

分享到:
评论

相关推荐

    Python 中的字谜游戏

    在Python编程中,创建一个字谜游戏是一种有趣的实践,它能帮助学习者加深对语言特性的理解。这个项目的目标是构建一个游戏,用户需要在有限的尝试次数内猜出一个单词,游戏会给出一些提示来帮助用户。让我们深入探讨...

    K230字谜游戏代码分享

    K230字谜游戏是一款结合了趣味性和教育性的文字解谜类游戏,旨在通过挑战玩家的词汇量、逻辑思维和问题解决能力来提供娱乐。本资源包提供了K230字谜游戏的完整代码实现,包括但不限于游戏逻辑、用户界面设计、数据...

    Java作业4字谜游戏.zip

    在本Java作业中,我们关注的是“字谜游戏”的实现,这是一个常见的编程练习,旨在提升学生对字符串操作、条件逻辑以及面向对象编程的理解。在这个项目中,学生通常会被要求设计并实现一个字谜游戏,玩家需要通过提示...

    netbeans字谜游戏

    "NetBeans字谜游戏"是一款基于NetBeans IDE开发的小型应用程序,主要功能是提供一个交互式的字谜游戏体验。NetBeans是一个开源的集成开发环境,它支持多种编程语言,包括Java,这使得开发者能够利用其丰富的功能来...

    c语言数独字谜游戏课程设计.doc

    C语言数独字谜游戏课程设计 C语言数独字谜游戏课程设计是基于VC++6.0环境下所开发的程序,旨在实现一个完整的数独游戏。游戏的主要功能包括难度选择、游戏过程、游戏通关和退出游戏等。 技术路线: * 使用VC++6.0...

    数独字谜解法

    对于数独字谜的解法,程序简介,适合初学者使用。节省时间试试看裁决之镰测试正常上课尝试几次生产基地参加第几

    40个有趣的英语字谜游戏.pdf

    40个有趣的英语字谜游戏.pdf

    字谜_数据库脚本

    汉字字谜,已经整理成数据库脚本可直接导入,总计3860个。

    字谜大全及答案.txt

    字谜大全及答案.

    小学生字谜大全.doc

    为了更好地传承和弘扬汉字文化,字谜游戏应运而生,成为一种深受各个年龄层喜爱的益智活动。特别是对于小学生来说,字谜不仅能够激发他们对汉字学习的兴趣,还能锻炼他们的观察力、联想力和逻辑思维能力。在这篇...

    一个简单的字谜算法

    标题“一个简单的字谜算法”指的是在编程领域中设计的一种用于解决字谜问题的算法。字谜通常涉及找出隐藏在单词或短语中的特定模式,这可能涉及到字母位置的替换、颠倒或移位。在这个特定的例子中,我们可能会探讨一...

    15字谜

    玩15字谜的很不错哦

    matlab开发-matlab竞赛纵横字谜

    可能涉及到字符串处理(如strfind、split函数)、矩阵操作(如逻辑索引、线性索引)、回溯法、深度优先搜索等算法。此外,可能还需要使用到MATLAB的单元数组和cell数组来处理不规则数据。 4. **testsuite_sample....

    3d阿福图库字谜总汇.doc

    3d阿福图库字谜总汇.doc

    字谜集锦,可以和学生一起互动.doc

    字谜集锦是指通过游戏、挑战和互动方式来学习汉字的方法。这种方法可以激发学生的兴趣和热情,让他们更好地记忆和掌握汉字。下面是字谜集锦的详细知识点: 1. 字谜的种类:字谜可以分为多种,如谜语谜、图谜、音谜...

    小学数学数学神探同一字谜

    对于现代的孩子们来说,这样的字谜游戏不仅能够锻炼他们的逻辑思维能力和观察力,更能够加深他们对中国传统文化和汉字的认识。通过这种有趣的形式,孩子们可以在轻松愉快的氛围中学习到知识,增长智慧。 总结这个...

    字谜大全(附答案).doc

    它通过巧妙的文字游戏,挑战解谜者的知识和想象力,是一种结合了传统文化与语言文字智慧的智力游戏。今天,我们将深入探讨这些充满趣味和挑战的字谜,以及它们背后所蕴含的汉字魅力。 首先,我们注意到字谜的构造...

    小学生一年级简单字谜大全.doc

    字谜的解答过程能够锻炼孩子们的观察力、思维能力和想象力,同时也能够增强他们对汉字的记忆能力。这些能力的提升,不仅有助于孩子们在语文学习上的进步,而且对他们的综合素质的培养也有着重要的意义。因此,字谜...

    小学生字谜大全小编资料全.doc

    它通过趣味盎然的字谜游戏,帮助孩子们在轻松的氛围中学习和掌握汉字,进而加深对中国传统文化的理解和兴趣。这样的一份资料,不仅适用于课堂教学,也适合家庭亲子互动,是一种值得推广的汉字学习方式。

Global site tag (gtag.js) - Google Analytics