花花生米

导航

迷宫

【题目】:给定一个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);//几种方案

	}


}

posted on 2020-03-26 17:30  花花生米  阅读(321)  评论(0编辑  收藏  举报