洛谷P1605 Java解法

题目出处点这里
洛谷P1605 Java解法_第1张图片
思路:深度优先搜索,走不通就返回上一步接着找,走法有上下左右四种方案,代码很简单

代码有解释(详细):

package search;

import java.util.Scanner;

public class P1605 {

	static int N, M, T, SX, SY, FX, FY, sum;// sum代表方案总数
	static int[][] chess;//表示棋盘

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		M = sc.nextInt();
		T = sc.nextInt();
		SX = sc.nextInt();
		SY = sc.nextInt();
		FX = sc.nextInt();
		FY = sc.nextInt();
		chess = new int[N + 1][M + 1];
		for (int i = 0; i < N + 1; i++) {
			chess[i][0] = 1;// 第一列置为障碍
			chess[0][i] = 1;// 第一行置为障碍
		}
		for (int i = 0; i < T; i++) {
			chess[sc.nextInt()][sc.nextInt()] = 1;// 1代表障碍
		}
		dfs(SX, SY);
		System.out.println(sum);
	}

	/**
	 * 
	 * @param row 起点的行
	 * @param col 终点的列
	 */
	public static void dfs(int row, int col) {
		chess[row][col] = 2;// 先把当前所在点置为访问过
		if (chess[FX][FY] == 2) {// 2代表访问过
			sum++;// 每成功一次sum++
			chess[FX][FY] = 0;//每当走得通就把终点重新置为0(也就是没访问过)
			return;//返回
		}
		
		// 四种方法 上、下、左、右
		// 只有每一种方法不超出棋盘范围,无障碍,没被走过,才可以行得通
		if (row - 1 >= 1 && chess[row - 1][col] == 0) {// 上
			dfs(row - 1, col);
		}
		if (row + 1 <= N && chess[row + 1][col] == 0) {// 下
			dfs(row + 1, col);
		}
		if (col - 1 >= 1 && chess[row][col - 1] == 0) {// 左
			dfs(row, col - 1);
		}
		if (col + 1 <= M && chess[row][col + 1] == 0) {// 右
			dfs(row, col + 1);
		}
		chess[row][col] = 0;//每一种走法走完过后,都要将当前所在点置为0(也就是重新设置为没走过),因为有可能另一种走法也要用到此点
	}
}

你可能感兴趣的:(洛谷)