La tercera sesión-03 Revitalizar China

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

Durante el juego, primero párate en la cuadrícula con la palabra "desde" en la esquina superior izquierda. Puedes saltar a la cuadrícula adyacente horizontal o verticalmente, pero no a la cuadrícula diagonal u otras posiciones. Salte siempre al final de la palabra "华". La ruta solicitada para ser saltada simplemente constituye la frase "empezando por mí para revitalizar China". Por favor, ayude a Xiao Ming a calcular cuántas rutas de salto posibles tiene en total.
La respuesta es un número entero, envíe el número directamente a través del navegador. Nota: No envíe el proceso de respuesta u otro contenido explicativo de apoyo.

En primer lugar, recibimos una pregunta. No te asustes. Piensa con calma. ¿Has hecho este tipo de preguntas antes? Usa el tipo de algoritmo que tienes ahora para resolverlas. No digas que no puedes. ¡Cálmate! Trabaja duro, sigue pensando, ¡en caso de que lo hagas bien!

Escribiendo uno: recursividad

Primero, simplificamos el problema. La cuadrícula aquí tiene un ancho de 5 y una altura de 4, y solo el último número en la matriz es "Hua", por lo que si podemos ir a la última posición, nuestro plan de ruta puede ser +1.
Resumen: ¡Considere los límites! ! !

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

Método de escritura 2: retroceso

Pensamiento: Con la recursividad, puede haber un problema de conteo doble. La idea de retroceder es seguir una ruta posible hasta que llegue al final y luego invertirla para ver si hay otra ruta posible para el nodo anterior. Si no hay otra ruta posible, continúe buscando. Si hay otra ruta posible, continúe. Encuentre un camino, y así sucesivamente, hasta completar todos los caminos.

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

Otro método 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);
			}
		}

	}

Nota: ¡El constructor debe convertirse en una cadena antes de llamar al método equals ()!

constructor.toString (). equals ();

fin.

Supongo que te gusta

Origin blog.csdn.net/weixin_44998686/article/details/108990284
Recomendado
Clasificación