棋盘最短路径:
题目描述:
假设以一个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