矩陣中的路徑


請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。
路徑可以從矩陣中任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那么該路徑不能再次進入該格子。
例如在下面的3×4的矩陣中包含一條字符串“bfce”的路徑(路徑中的字母用下划線標出)。
但矩陣中不包含字符串“abfb”的路徑,因為字符串的第一個字符b占據了矩陣中的第一行第二個格子之后,路徑不能再次進入這個格子。

思路

這是一個回溯法解決的典型題
基本思路:
0. 根據給定數組,初始化一個標志位數組,初始化為false,表示未走過,true表示已經走過,不能走第二次

  1. 根據行數和列數,遍歷數組,先找到一個與str字符串的第一個元素相匹配的矩陣元素,進入hasPathCore
  2. 根據col和row先確定一維數組的位置,因為給定的matrix是一個一維數組
  3. 確定遞歸終止條件:越界,當前找到的矩陣值不等於數組對應位置的值,已經走過的,這三類情況,都直接false,說明這條路不通
  4. 若pathLength,就是待判定的字符串str的索引已經判斷到了最后一位,此時說明是匹配成功的
  5. 下面就是本題的精髓,遞歸不斷地尋找周圍四個格子是否符合條件,只要有一個格子符合條件,就繼續再找這個符合條件的格子的四周是否存在符合條件的格子,直到pathLength到達末尾或者不滿足遞歸條件就停止。
  6. 走到這一步,說明本次是不成功的,我們要還原一下標志位數組index處的標志位,進入下一輪的判斷。

實現

public boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
	if (matrix == null || rows < 1 || cols < 1 || str == null) {
		return false;
	}
	//標志位數組
	boolean[] isVisited = new boolean[rows * cols];

	int pathLength = 0;
	for (int row = 0; row < rows; row++) {
		for (int col = 0; col < cols; col++) {
			if (hasPathCore(matrix, rows, cols, row, col, str, pathLength, isVisited))
				return true;
		}
	}
	return false;
}


private boolean hasPathCore(char[] matrix, int rows, int cols, int row, int col, char[] str, int pathLength,
							boolean[] isVisited) {
	//先根據col和row計算第一個元素轉一位數組的位置
	int index = row * cols + col;
	//遞歸終止條件
	if (row < 0 || col < 0 || row >= rows || col >= cols ||
			matrix[index] != str[pathLength]//如果不匹配返回false
			|| isVisited[index] == true) {
		return false;
	}
	//若pathLength已經到str末尾,說明之前的匹配成功了,直接返回True即可
	if (pathLength == str.length - 1) {
		return true;
	}
	//表示已經走過了
	isVisited[index] = true;
	//回溯,遞歸尋找,每次找到了就給k加一,找不到,還原
	boolean hasPath = hasPathCore(matrix, rows, cols, row - 1, col, str, pathLength + 1, isVisited)
			|| hasPathCore(matrix, rows, cols, row + 1, col, str, pathLength + 1, isVisited)
			|| hasPathCore(matrix, rows, cols, row, col - 1, str, pathLength + 1, isVisited)
			|| hasPathCore(matrix, rows, cols, row, col + 1, str, pathLength + 1, isVisited);
	if (hasPath) {
		return true;
	}
	//走到這,說明這一條路不通,還原,再試其他的路徑
	isVisited[index] = false;
	return false;
}

此解來自牛客網 我去個地方啊 非常感謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM