算法题每周一坑(BFS 与队列 DFS与递归)
搜索
POJ 3984 迷宫
迷宫题:这道题因为迷宫大小有限,所以我用了结构体数组对队列进行模拟
struct node{
int x,y,pre; //需要保存上一个节点的下标,为了之后输出坐标
}queue[100];
总体思路是:从第一个(0,0)点判断周围所有可能的节点,按照顺序进入队列
出队时,递归输出路径的坐标,因为是BFS(层层推进),所以当队列中访问到
最终出口时,即为为短路径
POJ 3278
闪现中的入队出队,输出数据(不用第一题的递归)
hile(front<rear)
{
if(queue[front].x==b)
{
printf("%d\n",queue[front].step);
return;
}
for(i=0;i<3;i++){
if (i == 0)
next_step=queue[front].x+1;
else if(i==1)
next_step=queue[front].x-1;
else
next_step=queue[front].x*2;
if(inter(next_step))
{
visit[next_step]=1;
queue[rear].x=next_step;
queue[rear].step = queue[front].step+1;
rear++;
}
}
front ++;
}
POJ 1426 二进制
这一道题是一道很典型的DFS和递归的运用
但是最后实现的时候却像一个二叉树的前序
遍历搜索,核心的递归代码如下
void dfs(unsigned long long int x,int k,int n)
{
if(f) //f为全局变量
return ;
if(x%n==0)
{
printf("%llu\n",x);
f=1;
return ;
}
if(k==19)
return ;
dfs(x*10,k+1,n);
dfs(x*10+1,k+1,n);
}
前序遍历:ABDHIEJKCFLMGNO 注:A右侧的节点为C