Word Maze(单词迷宫)

Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉。如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f。


    但现在你的任务可没有这么简单,你现在处于一个迷宫Maze(n×m的矩阵)当中,里面到处都是以字母标注的食物,但你只能吃掉能连成给定单词W的食物。


如下图,指定W为“SOLO”,则在地图中红色标注了单词“SOLO”。 

 

注意区分英文字母大小写,你只能上下左右行走。

运行时间限制: 无限制
内存限制: 无限制
输入:

输入第一行包含两个整数n、m(0<n, m<21)分别表示n行m列的矩阵,第二行是长度不超过100的单词W,从第3行到底n+3行是只包含大小写英文字母的长度为m的字符串。

输出:

如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。注意:每个字母只能用一次。

样例输入:
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC
样例输出:
YES
 
 


示例代码:


import java.util.*;
public class Main{
	
	private static int n, m;
	private static boolean[][] flagArr;
	private static char[][] array;
	private static boolean isFound;
	
	public static void main(String args[]){
		Scanner cin = new Scanner(System.in);
		String word;
		while (cin.hasNext()){
			n = cin.nextInt();
			m = cin.nextInt();
			array = new char[n][m];
			word = cin.next();
			isFound = false;
			for(int i=0; i<n; i++) {
				array[i] = cin.next().toCharArray();
			}
			flagArr = new boolean[n][m];
			for(int i=0; i<n; i++) {
				for(int j=0; j<m; j++){
					flagArr[i][j] = false;
				}
			}
			
			findWord(word);
			
			if(isFound) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}
		}
	}

	private static void findWord(String word) {
		for(int i=0; i<n; i++) 
			for(int j=0; j<m; j++) {
				if(array[i][j] == word.charAt(0)) {
					flagArr[i][j] = true;
					findNext(word, 1, i, j);
					if(isFound)
						return ;
					else
						flagArr[i][j] = false;
				}
			}
	}

	private static void findNext(String word, int index, int x, int y) {
		if(index == word.length()) { 
			isFound = true;
			return ;
		} else if(index < word.length()){
			int nextIndex = index + 1;
			//up
			if ((x-1)>=0 && (!flagArr[x-1][y]) && array[x-1][y]==word.charAt(index)) {
				flagArr[x-1][y] = true;
				findNext(word, nextIndex, x-1, y);
			}
			//right
			if((y+1)<m && (!flagArr[x][y+1]) && array[x][y+1]==word.charAt(index)) {
				flagArr[x][y+1] = true;
				findNext(word, nextIndex, x, y+1);
			}
			//dowm
			if ((x+1)<n && (!flagArr[x+1][y]) && array[x+1][y]==word.charAt(index)) {
				flagArr[x+1][y] = true;
				findNext(word, nextIndex, x+1, y);
			}
			//left
			if((y-1)>0 && (!flagArr[x][y-1]) && array[x][y-1]==word.charAt(index)) {
				flagArr[x][y-1] = true;
				findNext(word, nextIndex, x, y-1);
			}
			flagArr[x][y] = false;
		}
	}
	
}





你可能感兴趣的:(Word Maze(单词迷宫))