P1605 迷宫

题目描述:给定一个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

 

题整体来说比较简单,用深搜一个个查,使用一个数组b记录障碍的地方(或是否走过)

#include
#include
#include
#include
#include
#include
#include
using namespace std;
long long int n,m,t,sx,sy,fx,fy;//n为行,m为列,t为障碍数,sx与sy为起点坐标,fx与fy为终点坐标 
long long int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//方向坐标 
long long int ans=0,b[101][101],t1,t2; //ans为方案总数,b为地图,t1与t2为障碍坐标 
void dfs(long long int idx,long long int idy)
{
	if(idx==fx&&idy==fy)//是否到达终点 
	{
		ans++;//方案数加1 
	}
	else//没有到达终点 
	{
		for(int i=0;i<4;i++)//枚举四个方向(上下左右) 
		{
			if(b[idx+dx[i]][idy+dy[i]]==0&&idx+dx[i]>0&&idx+dx[i]<=n&&idy+dy[i]>0&&idy+dy[i]<=m)//判断是否走过(或是否为障碍物),和是否在边界里(不能超出边界) 
			{
				b[idx+dx[i]][idy+dy[i]]=1;//标记为1,表示不可以走 
				dfs(idx+dx[i],idy+dy[i]);
				b[idx+dx[i]][idy+dy[i]]=0;//标记为0,表示可以走 
			}
		}
	}
}
int main()
{
	scanf("%lld %lld %lld",&n,&m,&t);//输入 
	scanf("%lld %lld %lld %lld",&sx,&sy,&fx,&fy);//输入起点坐标与终点坐标 
	b[sx][sy]=1;//每个方格最多经过1次,所以也不能回到起点 
	for(int i=0;i 
 

你可能感兴趣的:(P1605 迷宫)