记忆型深搜

对蓝桥杯练习的一次简单记录

蓝桥杯2017年B组分割方格

【题目描述 - Problem Description】

6x6的方格,沿着格子的边线剪开成两部分。

要求这两部分的形状完全相同。

如图:p1.png, p2.png, p3.png 就是可行的分割法。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

试计算: 包括这3种分法在内,一共有多少种不同的分割方法。

注意:旋转对称的属于同一种分割法。

请提交该整数,不要填写任何多余的内容或说明文字。

由于搜索的方向不确定需要利用记忆型DFS搜索

记忆化搜索实际上是递归来实现的,但是递归的过程中有许多的结果是被反复计算的,这样会大大降低算法的执行效率。

而记忆化搜索是在递归的过程中,将已经计算出来的结果保存起来,当之后的计算用到的时候直接取出结果,避免重复运算,因此极大的提高了算法的效率。

#include <bits/stdc++.h>
using namespace std;
int ans;
int dire[][2]={{-1,0},
               {1,0},
               {0,-1},
               {0,1}};
/**
 * dire二维数组记录四个方向上下左右*/
int vis[7][7];
/*vis数组用来记录当前条件下已经访问过的位置*/
void dfs(int x,int y) {
    /*到达图片边缘,递归出口条件*/
    if (x==0||y==0||x==6||y==6) {
        ans++;
//        cout<<ans<<' ';
        return;
    }
    vis[x][y]=1;
    vis[6-x][6-y]=1;
    /*这道题是一个对称式搜索
     * 同时标记让中心对称的点同时进入搜索*/
    for (int i = 0; i < 4; ++i) {
        int nx=x+dire[i][0];
        int ny=y+dire[i][1];
        if (nx<0||nx>6||ny<0||ny>6) continue;//到达边缘
        if (!vis[nx][ny]) {
            /*当前未搜索*/
            dfs(nx,ny);
        }
    }
    /*释放已访问数组*/
    vis[x][y]=0;
    vis[6-x][6-y]=0;
}
int main() {
    dfs(3,3);
//    cout<<endl;
    cout<<ans/4;//除以4是图片可以旋转90°会得到4张一样的分割图案
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值