相信很多人在最先开始学习深度优先搜索(dfs)的时候,都是一脸懵逼,但其实只要通过一定数目的练习,你就可以熟练运用这一算法(骗分神器)了,下面是我挑选出的几道dfs题目(源自洛谷),相信你练习完了以后,对这一神奇算法也会有更深的体会。
首先是一道dfs的入门题:
下面是代码
#include<bits/stdc++.h>//万能头
using namespace std;
char keyword[]="yizhong";
char square[101][101]; //输入数组
char book[101][101]; //记录变化的数组
int drive[8][2]={
{
-1,0},{
-1,1},{
0,1},{
1,1},{
1,0},{
1,-1},{
0,-1},{
-1,-1}};//八方向数组
int n; //n*n
struct road{
//记录路径的结构体
int x , y;
};
road way[7]; //记录路径
void dfs(int x , int y , int state ,int dir)//dir是方向,搜索的方向,x,y是开始搜索的坐标,state当前搜索到了第几个字母
{
if(state>6){
for(int i = 0 ; i < 7 ; i++) //如果搜索完了,说明所求的就是想要的
book[way[i].x][way[i].y] = 1; //记录路径
}
else if(state <= 6){
int dx = x + drive[dir][0];
int dy = y + drive[dir][1];
if(state == 6 || square[dx][dy] == keyword[state+1]){
//如果state等于6,说明已经搜索完了
way[state].x = x; //记录路径
way[state].y = y;
dfs(dx,dy,state+1,dir); //搜索下个节点,如果修改了state的值下面,如state++,下面就要加一行state--,以达到回溯的目的,这里偷懒了,就直接state+1了
}
}
}
int main()
{
cin>>n;
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < n ; j++){
cin>>square[i][j];