今天对搜索又有了一定的了解,但仍然存在误区,要通过题目的练习来提高这些。由于之前对搜索也是一知半解,今天通过学习完成了一道题目。
在完成迷宫的题目时,有以下的理解。
DFS(深度优先搜索)
迷宫常见问题
- 求多少条路径? DFS
- 要求你求出路径上所有的笛卡尔坐标 DFS/BFS
- 要求你在不触碰障碍的基础上,能走得最大面积 BFS
- 求走出迷宫的最短路径 BFS
笛卡尔坐标系坐标变化(八种情况)
上下左右
int xx[4]={0,0,-1,1}//分别表示X轴上下左右系数变化
int yy[4]={1,-1,0,0}//分别表示Y轴上下左右系数变化
对角线
int xx[4]={1,-1,-1,1}//分别表示X轴右上,左下,左上,右小系数变化
int yy[4]={1,-1,1,-1}//分别表示Y轴右上,左下,左上,右小系数变化
例题
题目背景
给定一个N*M方格的迷宫,迷宫里有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
说明/提示
【数据规模】
1≤N,M≤5
源代码:
DFS的模板
int check(参数)
{
if (满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每-种可能
{
满足check条件
标记
继续下一步dfs (step+1)
恢复初始状态(回溯的时候要用到)
}
}
希望加强练习,以及自学的能力,同时还要阅读《大话数据结构》。