第三届——03振兴中华

  1. 标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字: 
从我做起振 
我做起振兴 
做起振兴中 
起振兴中华

比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。

首先我们拿到一道题,不要被它吓到,要冷静思考,这种类型的题以前有没有做过,用自己现在掌握的哪种算法可以解决,千万不要说自己不可以,要冷静!要努力,坚持思考,万一你就做对了呢!

写法一:递归

首先我们把问题简化,这里的格子宽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.

猜你喜欢

转载自blog.csdn.net/weixin_44998686/article/details/108990284
今日推荐