java实现单词搜索迷宫游戏
本文实例讲述了java实现单词搜索迷宫游戏。分享给大家供大家参考。具体分析如下:
我们在杂志上,经常能够看到找单词的小游戏,在一个二维表格中,存在各种字母,我们可以从八个方向找单词。这个用计算机处理十分方便,但是,算法的好坏很重要,因为要是用蛮力算法实现,那么耗费的时间是不可想象的。
这是数据结构与问题求解Java语言描述一书中给的实现思路
完整代码如下,注释写的很明白了
importjava.io.BufferedReader;
importjava.io.FileReader;
importjava.io.InputStreamReader;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.List;
/**
*单词搜索迷宫
*
**/
publicclassWordSearch
{
/**
*在构造函数中构造两个输入流,单词的输入流,和表格的输入流
**/
publicWordSearch()throwsIOException
{
puzzleStream=openFile("输入表格文件路径:");
wordStream=openFile("输入单词文件路径:");
System.out.println("文件读取中...");
readPuzzle();
readWords();
}
/**
*@returnmatches共有多少个单词匹配
*按照每个位置从八个方向搜索
*rd表示行上得增量,eg:rd=-1,表示向上一行
*cd表示列上得增量eg:cd=-1。表示向左一步
*所以rd=1,cd=0表示南
*rd=-1,cd=0表示北,
*rd=-1,cd=1,表示东北
*/
publicintsolvePuzzle()
{
intmatches=0;
for(intr=0;r<rows;r++)
for(intc=0;c<columns;c++)
for(intrd=-1;rd<=1;rd++)
for(intcd=-1;cd<=1;cd++)
if(rd!=0||cd!=0)
matches+=solveDirection(r,c,rd,cd);
returnmatches;
}
/**
*在指定的坐标上,按照给定的方向搜索,返回匹配的单词数量
*@returnnumberofmatches
*/
privateintsolveDirection(intbaseRow,intbaseCol,introwDelta,intcolDelta)
{
StringcharSequence="";
intnumMatches=0;
intsearchResult;
charSequence+=theBoard[baseRow][baseCol];
for(inti=baseRow+rowDelta,j=baseCol+colDelta;
i>=0&&j>=0&&i<rows&&j<columns;
i+=rowDelta,j+=colDelta)
{
charSequence+=theBoard[i][j];
searchResult=prefixSearch(theWords,charSequence);
/**
*下面的if(searchResult==theWords.length)
*必须要判断,否则会出现越界的危险,及当最后一个单词之匹配前缀时,返回的是索引-1
**/
if(searchResult==theWords.length)
break;
/**
*如果没有响应的前缀,直接跳过这个基点的搜索,即使继续搜索,做的也是无用功
**/
if(!theWords[searchResult].startsWith(charSequence))
break;
if(theWords[searchResult].equals(charSequence))
{
numMatches++;
System.out.println("发现了"+charSequence+"在"+
baseRow+1+"行"+baseCol+"列"+
i+""+j);
}
}
returnnumMatches;
}
/**
*先解释Arrays.binarySearch(Object[],Object)
*使用二进制搜索算法来搜索指定数组,以获得指定对象。在进行此调用之前,
*必须根据数组元素的自然顺序对数组进行升序排序(通过上面的Sort(Object[]方法)。
*如果没有对数组进行排序,则结果是不明确的。(如果数组包含不可相互比较的元素(例如,字符串和整数),
*则无法根据数组元素的自然顺序对数组进行排序,因此结果是不明确的。)
*如果数组包含多个等于指定对象的元素,则无法保证找到的是哪一个。
*/
privatestaticintprefixSearch(String[]a,Stringx)
{
intidx=Arrays.binarySearch(a,x);
if(idx<0)
return-idx-1;
else
returnidx;
}
/**
*读取文件内容,获得输入流
*/
privateBufferedReaderopenFile(Stringmessage)
{
StringfileName="";
FileReadertheFile;
BufferedReaderfileIn=null;
do
{
System.out.println(message+":");
try
{
fileName=in.readLine();
if(fileName==null)
System.exit(0);
theFile=newFileReader(fileName);
fileIn=newBufferedReader(theFile);
}
catch(IOExceptione)
{System.err.println("Cannotopen"+fileName);}
}while(fileIn==null);
System.out.println("Opened"+fileName);
returnfileIn;
}
/**
*读入表格
**/
privatevoidreadPuzzle()throwsIOException
{
StringoneLine;
List<String>puzzleLines=newArrayList<String>();
if((oneLine=puzzleStream.readLine())==null)
thrownewIOException("Nolinesinpuzzlefile");
columns=oneLine.length();
puzzleLines.add(oneLine);
while((oneLine=puzzleStream.readLine())!=null)
{
if(oneLine.length()!=columns)
System.err.println("Puzzleisnotrectangular;skippingrow");
else
puzzleLines.add(oneLine);
}
rows=puzzleLines.size();
theBoard=newchar[rows][columns];
intr=0;
for(StringtheLine:puzzleLines)
theBoard[r++]=theLine.toCharArray();
}
/**
*读取已经按照字典排序的单词列表
*/
privatevoidreadWords()throwsIOException
{
List<String>words=newArrayList<String>();
StringlastWord=null;
StringthisWord;
while((thisWord=wordStream.readLine())!=null)
{
if(lastWord!=null&&thisWord.compareTo(lastWord)<0)
{
System.err.println("没有按照字典顺序排序,此次跳过");
continue;
}
words.add(thisWord.trim());
lastWord=thisWord;
}
theWords=newString[words.size()];
theWords=words.toArray(theWords);
}
//Cheapmain
publicstaticvoidmain(String[]args)
{
WordSearchp=null;
try
{
p=newWordSearch();
}
catch(IOExceptione)
{
System.out.println("IOError:");
e.printStackTrace();
return;
}
System.out.println("正在搜索...");
p.solvePuzzle();
}
privateintrows;
privateintcolumns;
privatechar[][]theBoard;
privateString[]theWords;
privateBufferedReaderpuzzleStream;
privateBufferedReaderwordStream;
privateBufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
}
希望本文所述对大家的java程序设计有所帮助。