AcWing3502.不同路径树

原题链接

思路:DFS

两层循环,将图中每个点都作为起始点,进行DFS,在DFS过程中记录下层数和形成的数的值,DFS进行k次后,将形成的数值插入哈希表,最后输出哈希表的大小即可。

(注意:因为题目说明走过的点可以再走,所以不需要记录状态。另外,因为unordered-set对于相同的值只能存一次,所以无需担心记录重复的路)

#include<iostream>
#include<unordered_set>
using namespace std;
const int N = 10;
int n,m,k;
int g[N][N];
unordered_set<int> s;
int dx[4] = {-1,0,1,0},dy[4] = {0,-1,0,1};
void dfs(int x,int y,int u,int r)
{
    if(u > k)
    {
        s.insert(r);
    }
    else{
        for(int i = 0;i < 4;i ++)
        {
            int a = x + dx[i],b = y + dy[i];
            if(a >= 1 && a <= n && b >= 1 && b <= m)
                dfs(a,b,u + 1,r * 10 + g[a][b]);
        }
    }
}
int main()
{
    cin >> n >> m >> k;
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= m;j ++)
        {
            cin >> g[i][j];
        }
    }
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= m;j ++)
        {
            dfs(i,j,1,g[i][j]);
        }
    }
    cout << s.size() << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值