- 标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。 地上画着一些格子,每个格子里写一个字: 从我做起振 我做起振兴 做起振兴中 起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。
首先我们拿到一道题,不要被它吓到,要冷静思考,这种类型的题以前有没有做过,用自己现在掌握的哪种算法可以解决,千万不要说自己不可以,要冷静!要努力,坚持思考,万一你就做对了呢!
写法一:递归
首先我们把问题简化,这里的格子宽5,高4,只有数组的最后一个数才是“华”,所以能走到最后位置的,我们的路径方案就可以+1。
总结:考虑边界!!!
public static void main(String[] args) {
String str1 = "从我做起振";
String str2 = "我做起振兴";
String str3 = "做起振兴中";
String str4 = "起振兴中华";
char[][] ch = new char[4][];
ch[0] = str1.toCharArray();
ch[1] = str2.toCharArray();
ch[2] = str3.toCharArray();
ch[3] = str4.toCharArray();
int count = f(0, 0);
System.out.println(count);
}
// 重复
// 变化
// 边界
public static int f(int i, int j) {
if (i == 3 || j == 4) {
return 1;
}
// 将两种方式加起来
return f(i + 1, j) + f(i, j + 1);
}
}
写法二:回溯
思想:用递归可能会出现重复计算的问题。回溯的思想就是沿着一条可能的路径,直到走到头,才倒转过来,看上一个结点是否有另一条可能的路径,没有就继续往上找,如果存在另一条可能的路径,就接着那条路径找,如此反复,直到所有的路径都走完。
static int count;
public static void main(String[] args) {
String str1 = "从我做起振";
String str2 = "我做起振兴";
String str3 = "做起振兴中";
String str4 = "起振兴中华";
char[][] ch = new char[4][];
ch[0] = str1.toCharArray();
ch[1] = str2.toCharArray();
ch[2] = str3.toCharArray();
ch[3] = str4.toCharArray();
dfs(ch, new StringBuffer(), 0, 0);
System.out.println(count);
}
static public void dfs(char[][] ch, StringBuffer buffer, int row, int col) {
if (row >= ch.length || col >= ch[0].length) {
return;
}
if (buffer.toString().equals("从我做起振兴中") && ch[row][col] == '华') {
count++;
return;
}
buffer.append(ch[row][col]);
if (row < ch.length - 1) {
dfs(ch, buffer, row + 1, col);// 向下
}
if (col < ch[0].length - 1) {
dfs(ch, buffer, row, col + 1);// 向右
}
buffer.deleteCharAt(buffer.length() - 1);
}
另一种dfs方法:
static public void DFS(char[][] ch, int row, int col, StringBuilder builder) {
if (ch[row][col] == '华' && builder.toString().equals("我做起振兴中华")) {
count++;
return;
} else {
if (row < ch.length - 1) {
DFS(ch, row + 1, col, builder.append(ch[row + 1][col]));
builder.deleteCharAt(builder.length() - 1);
}
if (col < ch[0].length - 1) {
DFS(ch, row, col + 1, builder.append(ch[row][col + 1]));
builder.deleteCharAt(builder.length() - 1);
}
}
}
注意:builder要转换为string才能去调用equals()方法!
builder.toString().equals();
end.