word maze 单词迷宫 (java语言编写)

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

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

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

运行时间限制: 1000ms
内存限制: 30m
输入:

输入第一行包含两个整数n、m(0

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

5 5

SOLO

CPUCY

EKLQH

CRSOL

EKLQO

PGRBC

输出: YES

这题是典型的简化版迷宫算法。夜深了,简单画个图表示一下我解题的思路:

word maze 单词迷宫 (java语言编写)_第1张图片

就是进行暴力遍历比对,先将所有的顺序从头开始跟S比对,等比对到S的时候,就进入递归开始比对第二个字母

代码如下:

我这里将几个需要用到的变量作为全局变量,方便后面递归使用

public class Maze {
    private static String[][] data = null;
    private static int[][] mark = null;
    private static String result = null;
    private static String work = null;
    private static int n;
    private static int m;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            result="NO";
            n = sc.nextInt();
            m = sc.nextInt();
            work = sc.next();
            mark = new int[n][m];
            data = new String[n][m];
            for (int i = 0; i < n; i++) {
                // 这里直接将单词分开存入二位数组中
                data[i] = sc.next().split("");
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (!data[i][j].equals(String.valueOf(work.charAt(0)))) {
                        continue;
                    } else {
                        find(i, j, 0);
                    }
                }
            }
            System.out.println(result);
        }
    }

    public static void find(int i, int j, int f) {
        if (i < 0 || i >= n || j < 0 || j >= m || f >= work.length()
                || mark[i][j] == 1 || !data[i][j].equals(String.valueOf(work.charAt(f)))) {
            return;
        } else if (f == work.length() - 1 && String.valueOf(work.charAt(f)).equals(data[i][j])) {
            result = "YES";
            return;
        }
        mark[i][j] = 1;
        find(i-1,j,f+1);
        find(i+1,j,f+1);
        find(i,j-1,f+1);
        find(i,j+1,f+1);
        mark[i][j] = 0;
    }
}

word maze 单词迷宫 (java语言编写)_第2张图片

你可能感兴趣的:(java,基础算法)