深搜(最简单)

6 9....#......#..............................#@...#.#..#.11 9.#..........#.#######..#.#.....#..#.#.###.#..#.#..@#.#..#.#####.#..#.......#..#########............11 6..#..#..#....#..#..#....#..#..###..#..#..#@...#..#..#....#..#..#..7 7..#.#....#.#..###.###...@...###.###..#.#....#.#..0 0 

Sample Output
4559613

#include<stdio.h>
#include<string.h>
int m,n;
char a[100][100];
int aa[100][100];
void DFS(int x,int y)
{
    if(x>=0&&y>=0&&x<m&&y<n)
    {
        if(a[x][y]=='.'&&!aa[x][y])
        {
            aa[x][y]=1;
            DFS(x,y-1);
            DFS(x,y+1);
            DFS(x+1,y);
            DFS(x-1,y);
        }
    }
}
int main()
{
    int x,y,k,q,i,j;
    while(scanf("%d%d",&n,&m)!=EOF,m||n)
    {
        k=0;
        memset(aa,0,sizeof(aa));
        getchar();
        for(x=0; x<m; x++)
        {
            for(y=0; y<n; y++)
            {
                scanf("%c",&a[x][y]);
                if(a[x][y]=='@')
                {
                    i=x;
                    j=y;
                }
            }
            getchar();
        }
        a[i][j]='.';
        DFS(i,j);
        int sum=0;
        for(x=0; x<m; x++) 
            for(y=0; y<n; y++)  
            sum+=aa[x][y];
        printf("%d\n",sum);
    }
    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、付费专栏及课程。

余额充值