算法题18-DFS

棋盘最短路径:
题目描述
假设以一个nm的矩阵作为棋盘,每个棋位对应一个二维坐标(x,y)。你有一个棋子位于(0,0),现在需要将其移动到右下底脚(n-1,m-1),棋子可以向相邻的上下左右位置移动,每个坐标最多只能经过一次。棋盘散布着若干障碍,障碍物不能跨越,只能绕行,问是否存在到达右下底脚的路线,输出所需的最少移动次数;若不存在,输出0.Input第一行三个整数n,m和k,代表棋盘大小与障碍物个数1<n,M<100,k<nM.第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。
输入描述
输入三个正整数n,m和k,代表棋盘大小与障碍物个数1<n,M<100,k<n*M.
第二行至第k+1行,每行为两个整数x和y,代表k个障碍物的坐标。
输出描述
输出从起点到终点的最短路径的长度,如果不存在,即输出0
示例1:
输入
5 10 20
1 4
0 3
2 2
4 4
1 7
1 3
2 3
1 8
3 7
3 5
1 5
3 9
4 8
4 0
4 1
2 1
0 7
2 4
4 5
0 8

输出
0
        
DFS算法

代码:

import java.util.Scanner;
public class Main {
	static int out=Integer.MAX_VALUE;
	static int init=0;
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);		
		while (in.hasNextInt()) {			
			int n=in.nextInt();
			int m=in.nextInt();
			int k=in.nextInt();
			int[][] arr=new int[n][m];
			for(int i=0;i<n;i++) {
				for(int j=0;j<m;j++) {
					arr[i][j]=0;
				}
			}
			for(int i=0;i<k;i++) {
				int x=in.nextInt();
				int y=in.nextInt();
				arr[x][y]=1;
			}
			dfs(0,0,arr);
			if(out!=Integer.MAX_VALUE) {
				System.out.println(out);
			}else {
				System.out.println(0);
			}
			
			
			}			    			
        }
	public static void dfs(int xx,int yy,int[][] aa) {
		int nn=aa.length;
		int mm=aa[0].length;
		if(xx<0||yy<0) {
			return;
		}
		if(xx>nn-1||yy>mm-1||aa[xx][yy]==1) {
			return;
		}
		if(aa[xx][yy]==1) {
			return;
		}
		if(xx==nn-1&&yy==mm-1) {
			if(out==Integer.MAX_VALUE||init<out) {
				out=init;
			}
			return;
		}
		int num=init;
		init++;
		aa[xx][yy]=1;
		dfs(xx+1,yy,aa);
		dfs(xx,yy+1,aa);
		dfs(xx-1,yy,aa);
		dfs(xx,yy-1,aa);
		aa[xx][yy]=0;
		init=num;
	}	
}

测试用例:
/*5 10 20
1 4
0 3
2 2
4 4
1 7
1 3
2 3
1 8
3 7
3 5
1 5
3 9
4 8
4 0
4 1
2 1
0 7
2 4
4 5
0 8

0*/

xhs1

发布了80 篇原创文章 · 获赞 1 · 访问量 1435

猜你喜欢

转载自blog.csdn.net/alidingding/article/details/104152277