DFS和BFS的递归及非递归实现
一 DFS
1 递归实现
定义一个搜索的函数,对附近八个方向的点进行搜索,如果这些点可以满足条件,那么对这些点进行继续搜索。
void DFS(int x,int y)
{
if(x<1||x>m||y<1||y>n) return;
// 如果超过范围,直接返回
if(filed[x][y]) filed[x][y] = 0;
// 如果那点有石油那么继续搜索
else return;
for (int i = 0; i < 8; i++)
{
DFS(x+go[0][i], y+go[1][i]);
//打一个方向数组去前进(基操)
}
}
2 非递归实现
使用一个静态的队列去记录现有的搜索点,对底部点的八个方向进行搜索时,将符合条件的点,
1.借助数组的实现
int head;
void DFS(int x,int y)
{
if(x<1||x>m||y<1||y>n) return;
a[head].x = x;
a[head++].y = y;
while (head)
{
int ax = a[head].x;
int ay = a[head].y;
head--;
for (int i = 0; i < 8; i++)
{
if(!filed[ax+go[0][i]][ay+go[1][i]]) continue;
else filed[ax+go[0][i]][ay+go[1][i]] = 0;
a[head].x = ax + go[0][i];
a[head].y = ay + go[1][i];
head++;
}
}
}
2借助队列的实现
借助队列的先进后出的特性进行操作,直至队列为空,结束操作。
struct zb
{
int x,y;
}a[1000];
stack<zb>q;
void DFS(int x,int y)
{
if(x<1||x>m||y<1||y>n) return;
struct zb temp;
temp.x = x;
temp.y = y;
q.push(temp);
while (!q.empty())
{
temp = q.top();
int ax = temp.x;
int ay = temp.y;
for (int i = 0; i <8 ; i++)
{
if(filed[ax+go[0][i]][ay+go[1][i]])
{
temp.x = ax+go[0][i];
temp.y = ay+go[1][i];
q.push(temp);
}
}
}
return;
}
BFS
非递归实现
这道比较离谱的地方奇偶在于我只能写出来非递归的做法
#include <iostream>
#include <queue>
#define N 1010
using namespace std;
int aim[N];
int n,m;
struct Food
{
int num[N];//各种搭配的序号
int yy[N];//每个饲料里面含有的营养
int ans; //有几种
}food[N];
queue<Food>f;
void BFS()
{
for (int i = 1; i <= m; i++)
{
f.push(food[i]);
}
//首先让每一种可能进队
struct Food q,p;
while (!f.empty())
{
q = f.front();
p = f.front();
f.pop();
//删除f的最前面的节点。使它出队
int pan = 1;
for (int i = 1; i <=n; i++)
{
if(q.yy[i]<aim[i])
{
pan = 0;
break;
}
}
//如果此时营养成分可以满足,那么直接输出
if(pan)
{
printf("%d ",q.ans);
for (int i = 1; i <= q.ans; i++)
{
printf("%d ",q.num[i]);
}
return;
}
for (int i = q.num[q.ans]+1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
p.yy[j] = q.yy[j] + food[i].yy[j];
}
p.ans = q.ans+1;
p.num[p.ans] = i;
f.push(p);
}
// 从这一个选择的一下个开始,考虑每一种可能
}
}
int main()
{
scanf("%d",&n);
for (int i = 1; i <= n; i++)
{
scanf("%d",&aim[i]);
}
scanf("%d",&m);
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d",&food[i].yy[j]);
}
food[i].ans = 1;
food[i].num[1] = i;
}
BFS();
return 0;
}