P1605 迷宫(java)
题目背景
给定一个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
说明/提示
【数据规模】
1≤N,M≤5
import java.util.*;
import java.io.*;
public class Main {
// static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
static boolean vis[][]=new boolean[10][10];
static boolean vbs[][]=new boolean[10][10];
static int SX,SY,FX,FY;
static int count=0;
static int M,N;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
M=sc.nextInt();
int T=sc.nextInt();
// qishi
SX=sc.nextInt();
SY=sc.nextInt();
// zhongzhi
FX=sc.nextInt();
FY=sc.nextInt();
for(int i=0;i<T;i++){
int barryx=sc.nextInt();
int barryy=sc.nextInt();
vis[barryx][barryy]=true;
}
dfs(SX,SY);
System.out.println(count);
}
static void dfs(int x,int y){
// System.out.println(x+" "+y);
if(x==FX&&y==FY){
count++;
return;
}
int turn[][]=new int[2][4];
turn[0][0]=1;turn[1][0]=0;
turn[0][1]=0;turn[1][1]=1;
turn[0][2]=-1;turn[1][2]=0;
turn[0][3]=0;turn[1][3]=-1;
for(int i=0;i<4;i++){
if(x+turn[0][i]>=1&&y+turn[1][i]>=1&&x+turn[0][i]<=N&&y+turn[1][i]<=M&&
!vis[x+turn[0][i]][y+turn[1][i]]&&!vbs[x+turn[0][i]][y+turn[1][i]]){
vbs[x][y]=true;
dfs(x+turn[0][i],y+turn[1][i]);
vbs[x][y]=false;
}
}
}
}