概述
题目背景
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和
终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫
中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入样例 输出样例
【数据规模】
1≤N,M≤5
题目描述
输入输出格式
输入格式:
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点
坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式:
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方
案总数。
输入输出样例
输入样例#1
2 2 1
1 1 2 2
1 2
输出样例#1
1
思路
这题和我之前的迷宫问题是一个道理,但是略有不同。
//40分程序
#include <stdio.h>
#include <iostream>
using namespace std;
int tox[5]={0,1,0,-1,0};//这题就和那道迷宫一样,是一个道理,这个数组处理方向
int toy[5]={0,0,1,0,-1};//这也是(其实就是一个表!
int f[51][51],n,m,k,inx,iny,outx,outy,x1,y1,zx,zy,s;//f数组记录障碍,inx,iny为起点,outx,outy为重点
//zx,zy为当前障碍物,x1,y1是下一层的路径,s方案数
inline void dfs(int x,int y)//开始深♂搜
{
int j;
if(x1==outx && y1==outy)//如果到达终点
{
s++;//总方案加一次
return;//返回上一层
}
else for(j=1;j<=4;j++)//枚举搜索4个方向
{
x1=x+tox[j];//下一步的路径
y1=y+toy[j];//这也是
if(x1>=1&& x1<=n && y1>=1 && y1<=m &&f[x1][y1]==0)//如果下一步在地图内,且能走
{
f[x1][y1]=1;//标记走过了,和障碍物是一个概念不能走
dfs(x1,y1);//搜下一步能不能走
f[x1][y1]=0;//上一步还原
}
}
}
int main()
{
ios::sync_with_stdio(false);
int i,j;
cin>>n>>m>>k;
cin>>inx>>iny>>outx>>outy;
f[inx][iny]=1;//起点走过了
for(i=1;i<=k;i++)//开始找障碍物的点
{
cin>>zx>>zy;
f[zx][zy]=1;//障碍物标记不能走
}
dfs(inx,iny);//开始搜,从起点开始
cout<<s<<endl;//输出方案
return 0;
}
//100分程序
#include <stdio.h>
#include <iostream>
using namespace std;
int tox[5]={0,1,0,-1,0};//这题就和那道迷宫一样,是一个道理,这个数组处理方向
int toy[5]={0,0,1,0,-1};//这也是(其实就是一个表!
int f[51][51],n,m,k,inx,iny,outx,outy,zx,zy,s;//f数组记录障碍,inx,iny为起点,outx,outy为重点
//zx,zy为当前障碍物,s方案数
inline void dfs(int x,int y)//开始深♂搜
{
int j;
if(x==outx && y==outy)//如果到达终点
{
s++;//总方案加一次
return;//返回上一层
}
else for(j=1;j<=4;j++)//枚举搜索4个方向
{
//x1,y1是下一层的路径,找到问题了,原因就是这个下一步不能为全局变量,回溯的时候x1,y1都被改变了
int x1=x+tox[j];//下一步的路径
int y1=y+toy[j];//这也是
if(x1>=1&& x1<=n && y1>=1 && y1<=m &&f[x1][y1]==0)//如果下一步在地图内,且能走
{
f[x1][y1]=1;//标记走过了,和障碍物是一个概念不能走
dfs(x1,y1);//搜下一步能不能走
f[x1][y1]=0;//上一步还原
}
}
}
int main()
{
ios::sync_with_stdio(false);
int i,j;
cin>>n>>m>>k;
cin>>inx>>iny>>outx>>outy;
f[inx][iny]=1;//起点走过了
for(i=1;i<=k;i++)//开始找障碍物的点
{
cin>>zx>>zy;
f[zx][zy]=1;//障碍物标记不能走
}
dfs(inx,iny);//开始搜,从起点开始
cout<<s<<endl;//输出方案
return 0;
}
最后
以上就是酷炫果汁为你收集整理的[洛谷]P1605 迷宫 (#搜索 -1.4)的全部内容,希望文章能够帮你解决[洛谷]P1605 迷宫 (#搜索 -1.4)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复