package com.raylew.algorithm.other;
/*
标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
*/
/*
算法要点:最直接的直接用组合数学计算出来,编程方面用dfs枚举所有的路径,注意剪枝,统计满足条件的路径数目
*/
public class 振兴中华 {
public static String[][] arr = {{"从", "我", "做", "起", "振"},
{"我", "做", "起", "振", "兴"}, {"做", "起", "振", "兴", "中"},
{"起", "振", "兴", "中", "华"}};
public static int count = 1;
public static int sum = 0;
public static void main(String[] args) {
dfs(0, 0);
System.out.println(sum);
}
public static void dfs(int i, int j) {
if (count == 8) {
if (arr[i][j].equals("��")) {
sum++;
}
return;
}
if (count > 8) {
return;
}
// 枚举所有情况
count++;
// up
if (i > 0) {
dfs(i - 1, j);
}
// down
if (i < 3) {
dfs(i + 1, j);
}
// left
if (j > 0) {
dfs(i, j - 1);
}
// right
if (j < 4) {
dfs(i, j + 1);
}
count--;
}
}