3回目のセッション-03中国の活性化

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

ゲーム中は、最初に左上隅に「from」という単語が表示されたグリッドに立ちます。隣接するグリッドに水平または垂直にジャンプできますが、斜めのグリッドやその他の位置にジャンプすることはできません。常に「华」という単語の最後にジャンプします。スキップを要求されたルートは、「私から始めて中国を活性化する」というフレーズを構成しているにすぎません。Xiao Mingが合計でいくつの可能なジャンプルートを計算するのを手伝ってください?
答えは整数です。ブラウザから直接番号を送信してください。注:回答プロセスやその他の補足的な説明コンテンツは送信しないでください。

まず、質問があります。怖がらないでください。落ち着いて考えてください。この種の質問を以前に行ったことはありますか。現在のアルゴリズムを使用して解決してください。できないとは言わないでください。落ち着いてください。あなたがそれを正しく理解する場合に備えて、一生懸命働き、考え続けてください!

1つを書く:再帰

まず、問題を単純化します。ここのグリッドの幅は5、高さは4で、配列の最後の数字だけが「Hua」なので、最後の位置に移動できれば、パスプランは+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);
	}
}

書き方2:バックトラック

考え:再帰を使用すると、二重カウントの問題が発生する可能性があります。バックトラックの考え方は、可能なパスを最後までたどり、それを逆にして、前のノードに別の可能なパスがあるかどうかを確認することです。他に可能なパスがない場合は、検索を続けます。別の可能なパスがある場合は、それを続行します。すべてのパスが完了するまで、パスを検索します。

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);
			}
		}

	}

注:equals()メソッドを呼び出す前に、ビルダーを文字列に変換する必要があります。

builder.toString()。equals();

終わり。

おすすめ

転載: blog.csdn.net/weixin_44998686/article/details/108990284