算法学习之路|方格分割

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

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

试计算:

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

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

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

解题思路

首先建立一个模型:即从(3,3)开始一刀切,有多少种切法

应用算法:深度遍历/回溯

小技巧:

切痕为1,没切的地方为0.

切过就无法再次切了,即遇到1回溯,遇到0就遍历。

当成蜗牛型环路的时候因为最后四个方向都是1,所以一直回溯到出环路,这个问题无需考虑.

//方格分割
//暴力破解
#include <iostream>
using namespace std;
void dfs(int line,int column);

int times=0;
int map[7][7]={0};

int main(){
    dfs(3,3);
    cout<<times/4<<endl;//因为一开始(3,3)从四个方向出发,从一个方向深搜的结果与其他方向是相同的,只不过角度不同罢了。
    return 0;
}

void dfs(int line,int column){
    if(map[line][column]==1) return;//深度搜索的时候防止返回原路并且保持图片被一刀切两半
    
    map[6-line][6-column]=1;//对称型切法
    map[line][column]=1;//标记已经切开的路线
    if(line==0||column==0||column==6||line==6){//当与边界相撞的时候,即是一刀切开成功的时候
        times++;
        map[6-line][6-column]=0;
        map[line][column]=0;//回溯
        return ;
    }
    
    dfs(line-1,column);
    dfs(line,column-1);
    dfs(line+1,column);
    dfs(line,column+1);//各种情况
    
    map[6-line][6-column]=0;
    map[line][column]=0;//回溯
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值