dfs的多种用法
作者:
波风水门1
,
2024-04-12 18:12:08
,
所有人可见
,
阅读 9
dfs的多种用法:
(1)void dfs:
void dfs(...)
{
if(...) return;//到边界return
//要
st[i][j]=true;
dfs(...);
st[i][j]=false;//回溯
//不要
dfs(...);
}
(2)bool dfs:
bool dfs(...)
{
if(...)//到边界return判断
{
if(...) return true;
return false;
}
//要
st[i][j]=true;
if(dfs(...)) return true;
st[i][j]=false;//回溯
//不要
if(dfs(...)) return true;
}
(3)要求把所有给的数都用上的情况(排列数字)(主要通过for和st来实现):
void dfs(...)
{
if(...) return;
for(int i=1;i<=n;i++)//遍历1~n所有数
{
if(!st[i])//已经排列进去的数就不能再用了
{
path[u]=i;//用来记录排列好的数,可以用作输出结果
st[i]=true;
dfs(u+1);//下一个位置填上数,u表示位置
st[i]=false;//回溯
}
}
}
(4)需要用path存排列情况:飞机降落,排列数字
(5)用dfs遍历整个连通块(海战):
void dfs(int x,int y)
{
st[x][y]=true;
for(int i=0;i<4;i++)//上下左右四个方向的遍历
{
int x1=x+dx[i],y1=x+dy[i];
if(x1>=0&&y1>=0&&x1<n&&y1<m&&!st[i][j])//判断该坐标是否越界或者已经标记过了
dfs(x1,y1);
}
}