迷宫 - 花花生米
【题目】:给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
【输入格式】:
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
【输出格式】:
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
输入输出样例
输入
2 2 1
1 1 2 2
1 2
输出
1
【代码】:
import java.util.Scanner;
public class Shensouditu {
static int n,m,t,sx,sy,tx,ty,zx,zy,sum;
static int map[][]=new int[6][6];//地图
static int dir[][]= {{-1,0},{0,1},{0,-1},{1,0}};
public static boolean inmap(int x,int y)
{//判断是否y越界以及是否在图表中
return (x>=1&&x<=n&&y>=1&&y<=m);
}
public static void dfs(int x,int y)
{
if(x==tx&&y==ty)
{//判断是否到达了终点
sum++;return;
}
for(int i=0;i<4;i++)
{
int nx=x+dir[i][0];//进入下一个格子
int ny=y+dir[i][1];
if(inmap(nx,ny)&&map[nx][ny]!=1&&map[nx][ny]!=2)
/**
* 判断这个点是否在表中以及是否为障碍物以及是否走过*/
{
map[nx][ny]=2;//标记这个点已经走过
dfs(nx,ny);
map[nx][ny]=0;//清零
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
n=in.nextInt();m=in.nextInt();t=in.nextInt();
sx=in.nextInt();sy=in.nextInt();
tx=in.nextInt();ty=in.nextInt();
for(int i=0;i<t;i++)
{
zx=in.nextInt();zy=in.nextInt();
map[zx][zy]=1;//将障碍物设为1
}
map[sx][sy]=2;//将起点设为2以及走过的点
dfs(sx,sy);//开始深搜
System.out.println(sum);//几种方案
}
}