第11次课 深搜1 A
课堂回顾
递归
练一练
课堂学习
探秘蚁巢
蚁穴有许多的房间,胡乱走很容易迷路,这里提供了一种搜索方法。
1.遇到分岔口先搜索左边,再搜索右边
2.没有路时返回上一个房间,换其它路继续搜索
3.搜索过的房间不再搜索
从一个点开始,按照一定的顺序(先左后右)
沿着某条路往下走,能深则深
如果走完后发现不能到达目标,退回上一个点(不能深则退),
换条路,然后继续走,如此往复,直至可能的结果都被搜索完。
这种能深则深,不能深则退的方法,称之为深度优先搜索。
深搜(深度优先搜索)也可以搜索迷宫
假设有一个3行3列共9个房间的迷宫,迷宫内有一个宝箱。
每个房间都可以通往周围四个房间,但是不能走出迷宫。
1.规定一个搜索顺序,例如:下右左上
2.无法搜索时,返回上一个房间换其它方向继续搜索
3.访问过的房间不再访问
如果迷宫没有宝箱,按照刚才的搜索方法,从(1,1)开始搜索,最后搜索的房间是哪一个?
结论
练一练---A
深度优先搜索模板
#include<bits/stdc++.h>
using namespace std;
int vis[4][4];//标记数组
int ans;//统计搜索过的房间数量
int dx[4]={1,0,-1,0};//下右上左
int dy[4]={0,1,0,-1};//下右上左
void dfs(int x,int y){if(ans==9){//递归边界条件cout<<x<<','<<y;//最后搜索的房间return ;}for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(nx>0&&nx<=3&&ny>0&&ny<=3 && vis[nx][ny]==0){vis[nx][ny]=1;//标记已搜索ans++;//累加搜索过房间数量dfs(nx,ny);//从(nx,ny)继续搜索}}
}
int main(){vis[1][2]=1;//标记(1,2)房间搜索过ans++;//搜索过1个房间dfs(1,2);//从(1,2)开始搜索return 0;
}
课堂训练
1744 迷宫
描述
有 1 个 n×n 的迷宫方格,在方格内“0”表示可以通行,“1”表示是障碍物不能通行,在(n,n)位置有一个宝箱。现在有个人在左上角( 1 , 1 )的位置,他在迷宫内可以向当前位置的上、下、左、右四个方向行走,能不能在迷宫里走到宝箱位置( n,n )。注意:测试数据保证起点和终点均为“0”,走的过程不能走出迷宫。
输入描述
输入第一行为 n(2 ≤n≤10 ),表示 n×n 的方格,接下来有 n 行,每行 n 个整数, 0 表示可以行走,1 表示不能行走,每个整数之间有个空格。
输出描述
如果可以走到终点,输出“YES”,否则输出“NO”
样例输入 1
3 0 0 1 1 0 0 0 1 0
样例输出 1
YES
#include<bit