普及练习场-深度优先搜索-P1605 迷宫

题目描述
给定一个N*M(1≤N,M≤5)方格的迷宫,迷宫里有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
————————————————
思路:深搜

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 100;
int map[maxn][maxn];
bool book[maxn][maxn];
int dx[4] = {0,0,1,-1};
int dy[4] = {-1,1,0,0};
int ans,fx,fy,sx,sy,T,m,n,r,c;
void dfs(int x,int y)
{
	if(x == fx && y == fy)
	{
		ans++;
		return;
	}else
	{
		for(int i = 0; i <= 3;i++ )
		{
			if(book[x+dx[i]][y+dy[i]] == 0 && map[x + dx[i]][y+dy[i]] == 1)
			{
				book[x][y] = 1;
				dfs(x+dx[i],y+dy[i]);
				book[x][y] = 0;
			}
			
		}
	}
}
int main(){
	scanf("%d %d %d",&n,&m,&T);
	for(int ii = 1;ii <= n; ii++)
	for(int jj = 1;jj <= m; jj++)
	  map[ii][jj] = 1;
	  scanf("%d %d",&sx,&sy);
	  scanf("%d %d",&fx,&fy);
	  for(int k = 1; k <= T;k++)
	  {
	  	 scanf("%d %d",&r,&c);
	     map[r][c] = 0;
      }
    dfs(sx,sy);
    printf("%d\n",ans);
	return 0;
}
发布了108 篇原创文章 · 获赞 2 · 访问量 2076

猜你喜欢

转载自blog.csdn.net/zqhf123/article/details/104388420