题目背景
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
题目描述
无
输入格式
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
输入输出样例
输入 #1复制
2 2 1
1 1 2 2
1 2
输出 #1复制
1
深搜加回溯算法模板
void dfs(int x){
if(递归结束条件){
统计或输出结果;
return;//退出递归
}
for(int i=0;i<方案数;i++){
if(方案可行){
保存路径;
dfe(x+1);//递归调用
恢复到保存前的路径;//回溯
}
}
}
迷宫,思路分析:首先递归结束条件为到达终点,并统计或输出该路径,return;
在for循环中确定方案数,方案数为可行走方式,该题一共有种行走方式,(上下左右),分别找到行走方式数组表示。判断可行方案条件为是否达到迷宫边界和遇到障碍物行不通,需要换种方式行走。(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]==0)
在这里尽量将边界先判断,其次判断是否遇到障碍物,防止数组越界发生。
如果遇到可行方案,进行行走并记录该点已经走过,并进行下一步行走(递归),递归到一条方案结束时,返回回溯。
import java.util.*;
public class Main {
static int []dx=new int[]{-1,0,1,0};
static int []dy=new int[]{0,1,0,-1};
static int [][]a=new int[1000][1000];
static int ans=0;
static int n,bx,by,ex,ey;
static int m;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
int t=sc.nextInt();
bx= sc.nextInt();
by=sc.nextInt();
ex=sc.nextInt();
ey=sc.nextInt();
for(int i=1;i<=t;i++)
a[sc.nextInt()][sc.nextInt()]=1;
**a[bx][by]=1;///**一定要记得标记首个元素
dfs(bx,by);
System.out.println(ans);
}
public static void dfs(int x,int y){
if(x==ex&&y==ey){//到达终点
ans++;
return ;
}
for(int i=1;i<=4;i++){
int xx=x+dx[i-1];
int yy=y+dy[i-1];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]==0){//限制边界,并且指定障碍不可
a[xx][yy]=1;
dfs(xx,yy);
a[xx][yy]=0;//回溯
}
}
}
}