简单的深搜

一个机器人可以前后左右移动,问移动N次有多少种路径;

如移动一次可以前后左右移动有4种路径;注意:每条路径中不会有每个地方只能走一次;

一个很简单的深搜题,比较基础; 假设机器人最多移动15次,int就可以啦,移动16次就要long long了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#define MAX 50000+5
using namespace std;
bool book[100*100][100*100];              //标记该地点是否被走过,100*100的地图;
int cnt=0;                               //记录路径的数目;
int N;                                      //机器人移动的次数;
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; //前后左右移动;
void dsf(int x, int y, int step){        //深搜核心代码;
    if(step==N){                        //如果走了N步就return;
        cnt++;
        return;
    }
   book[x][y]=1;                        //标记走过的路径;
    int k=4;
    int tx, ty;
    for(k=0; k<=3; k++){
        tx=x+next[k][0];
        ty=y+next[k][1];
        if(book[tx][ty]==0){          //判断是否走过;
            book[tx][ty]=1;
            dsf(tx,ty,step+1);
            book[tx][ty]=0;          //消除标记;不可缺少;
        }
    }
}
int main(){
   while(scanf("%d",&N),N){
    memset(book, 0, sizeof(book));
    book[15][15]=1;
    cnt=0;
    dsf(15, 15, 0);
    printf("%d\n",cnt);
   }
    return 0;
}


### 混合递归与栈实现的度优先索(DFS)在树结构中的应用 度优先索(DFS)是一种用于遍历或索树或图的算法,其核心思想是沿着一个分支尽可能入地探索,直到无法继续为止,然后回溯到上一个分叉点并继续探索其他分支[^1]。对于树结构,DFS可以通过递归或显式使用栈来实现。 #### 递归实现 递归是实现DFS最直观的方法之一,它利用函数调用栈来记录访问路径。以下是一个基于递归的DFS实现示例,适用于树结构: ```python class TreeNode: def __init__(self, value=0, children=None): self.value = value self.children = children if children is not None else [] def dfs_recursive(node): if node is None: return print(node.value) # 访问当前节点 for child in node.children: dfs_recursive(child) # 递归访问子节点 # 构建一棵简单的树 root = TreeNode(1) child1 = TreeNode(2) child2 = TreeNode(3) child3 = TreeNode(4) root.children = [child1, child2] child1.children = [child3] # 调用递归DFS dfs_recursive(root) ``` 上述代码中,`dfs_recursive` 函数通过递归方式访问每个节点,并打印其值[^1]。这种方法简单且易于理解,但当树的度较大时可能会导致栈溢出问题。 #### 使用栈的非递归实现 为了克服递归可能导致的栈溢出问题,可以使用显式的栈来模拟递归过程。以下是非递归版本的DFS实现: ```python def dfs_iterative(root): if root is None: return stack = [root] # 初始化栈 while stack: node = stack.pop() # 弹出栈顶元素 print(node.value) # 访问当前节点 # 将子节点按反序压入栈中(保证访问顺序) stack.extend(reversed(node.children)) # 调用非递归DFS dfs_iterative(root) ``` 在此实现中,显式栈被用来存储待访问的节点。每次从栈中弹出一个节点进行访问,并将其子节点按反序压入栈中,以确保正确的访问顺序[^2]。 #### 含重复字符的字符串组合问题 在某些特殊场景下,DFS可以用于解决含重复字符的字符串组合问题。例如,给定字符串 `acc`,需要生成所有可能的组合。这种情况下,可以构造一棵索树并使用DFS遍历所有可能的路径[^3]。 ```python def generate_combinations(s): result = [] s = ''.join(sorted(s)) # 先对字符串排序,方便去重 def backtrack(start, path): if path: result.append(''.join(path)) used = set() for i in range(start, len(s)): if s[i] in used: # 跳过重复字符 continue used.add(s[i]) path.append(s[i]) # 做选择 backtrack(i + 1, path) # 递归 path.pop() # 撤销选择 backtrack(0, []) return result # 测试生成组合 combinations = generate_combinations("acc") print(combinations) ``` 上述代码通过DFS构建了一棵索树,并利用回溯法生成所有可能的组合。为避免重复组合,使用了 `set` 来记录已访问的字符[^3]。 ### 总结 度优先索(DFS)在树结构中的应用非常广泛,既可以采用递归方式实现,也可以通过显式栈来避免递归带来的栈溢出问题。此外,DFS还可以扩展到解决含重复字符的字符串组合等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值