迷宫(求方案问题)

题目描述

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。

给定起点坐标和终点坐标。如下图所示:

问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

输入格式

第一行N、M和T,N为行,M为列,T为障碍总数。

第二行起点位置(SX,SY),终点位置(FX,FY)。

接下来T行,每行为障碍点的坐标。

输出格式

给定起点位置和终点位置,问每个方格最多经过1次,从起点到终点的方案总数。

样例 #1

样例输入 #1

5 5 7 
1 1 5 5 
1 2
2 2
3 2
4 2
2 4
4 4
5 4

样例输出 #1

2

提示

对于 100% 的数据,1≤N,M≤51,1≤T≤10,1≤SX,FX≤n,1≤SY,FY≤m。

#include<bits/stdc++.h>
using namespace std;
const int N=50;
const int Len=4;
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
char g[N][N];
bool vis[N][N];
int dis[N][N],idx,n,m;
struct Node
{
	int x,y;
};
void bfs(int x,int y)//用队列作迷宫bfs
{
	queue<Node> q;
	Node cur;

	q.push((Node){x,y});
	vis[x][y]=idx;//初始化
	dis[x][y]=1;//初始化
	int nx,ny;
	while(!q.empty())//直到队列为空为止
	{
		cur=q.front();//备份
		q.pop();
		for(int i=0;i<=Len-1;++i)//枚举四个方向
		{
			nx=dx[i]+cur.x;
			ny=dy[i]+cur.y;
			if(nx<1 || nx>n || ny<1 || ny>m)//判断越界
			{
				continue;
			}
			if(g[nx][ny]=='#')//判断是否为障碍
			{
				continue;
			}
			if(vis[nx][ny])//判断是否走过
			{
				continue;
			}
			q.push((Node){nx,ny});
			vis[nx][ny]=true;//标记为走过
			dis[nx][ny]=dis[cur.x][cur.y]+1;记录答案
		}	
	}
	return;
}
int main()
{
	int i,j;
	cin>>n>>m;
	for(i=1;i<=n;++i)for(j=1;j<=m;++j)
	{
		cin>>g[i][j];
	}
	bfs(1,1);//dfs枚举迷宫
	cout<<dis[n][m];//输出答案
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值