2019第十届蓝桥杯B组决赛题解第五题

在一个5*5的方格上走边界点,其实也就是6*6的图,从左上角开始走,不走重复路径且在12步之内走回左上角点,问方案数
直接dfs,需要减掉 (0,0)->(1,0)->(0,0)和(0,0)->(0,1)->(0,0),这两个路线都重合了
结果: 208-2=206    
代码:

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 3e5+55555;
const ll mod = 998244353;
const double eps = 1e-7;
 
bool vis[10][10];
int ne[4][2] = {1,0,-1,0,0,1,0,-1};
int ans;
 
void output() {
    for(int i = 1;i<= 6;i++) {
        for(int j = 1;j<= 6;j++) {
            cout<<vis[i][j]<<' ';
        }
        cout<<endl;
    }
    cout<<endl<<endl;
}
 
void dfs(int x,int y,int step) {
    if(step> 12) {
        return ;
    }
    if(x == 1&&y == 1&&vis[1][1] == true) {
        ans++;
        // output();
        return ;
    }
    for(int i = 0;i< 4;i++) {
        int tx = x+ne[i][0];
        int ty = y+ne[i][1];
 
        if(x> 6||y> 6||x< 1||y< 1||vis[tx][ty]) continue;
        vis[tx][ty] = true;
        dfs(tx,ty,step+1);
        vis[tx][ty] = false;
    }
    return ;
}
 
int main() {
    dfs(1,1,0);
    cout<<ans-2<<endl;
 
    return 0;
}

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值