DFS(一):砌墙问题
问题描述
使用两种砖头砌墙,砖头A宽为2,高为1,砖头B宽为3,高为1,用这两种砖头砌一面宽为W,高为H的墙。
为了使墙牢固性高,要求每种砖只能横向摆放,不能竖起来,且除了两侧以外,不能出现上下对齐的砖缝,请参考下图:
上图允许

上图不允许
下图展示了宽为13,高为5的墙的一种砌法

对于给定的宽度W,高度H,请问有多少种砌法?
解决方案
该问题可以转化为搜索问题,使用深度优先搜索即可解决。
具体思路是:将墙转化为2维平面坐标系,使用二维字符数组记录砖缝的位置,放置砖块时,判断是否可行,不行则回溯。
从源点出发,向右上方进行递归搜索,直到搜索到对角顶点处,便得到了一种砌法,程序结束时,所有的砌法都已经被搜索到。
代码实现(c++)
#include<iostream>
#include<string>
#define yes 1
#define no 0
using namespace std;
static int kind = ;//可行的方案数
static int H,W;
//判断是否可以在该位置放置砖块
int IsOk(string abv, int w){
if(w>W)
return no;
else if (w==W)
return yes;
return (abv[w]-'')?no:yes;
}
//深搜
void dfs(int h, int w, string above[]){
if(h == (H+)){ //搜索的出口,输出合适的方案
kind ++;
for(int i=;i<=H;i++)
cout<<above[i]<<endl;
cout<<"---------------"<<endl;
return;
}
for(int i = ; i <=; i++){
if(IsOk(above[h-], w+i)){
above[h][w+i] = ''; //放置砖块,标记砖缝位置。
if((w+i)==W)
dfs(h+, , above);
else
dfs(h, w+i, above);
above[h][w+i] = ''; //回溯,搜索另一条路径。
}
}
return;
} int main(){
cin>>W;
cin>>H;
string above[H+];
for(int i = ; i <= H; i++){ //初始化字符串数组,用来记录砖缝位置。
above[i] = '';
for(int j = ; j <= W; j++)
above[i] += '';
}
dfs(, , above);
cout<<kind<<endl;
}
运行结果
输入:宽度9,高度5。
输出:14
DFS(一):砌墙问题的更多相关文章
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca
大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...
- http://blog.csdn.net/v_july_v/article/details/6543438
本文转载至: http://blog.csdn.net/v_july_v/article/details/6543438 算法 程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总 ...
- java设计模式之建造者模式
学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...
- .NET程序员走向高端必读书单汇总
.NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 4. 操作系统 5. 计算机网络 6. ...
- 挑战程序2.1.4 穷竭搜索>>深度优先搜索
深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386 思路:(⊙v⊙)嗯 和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...
- Builder模式
原文来源于http://www.iteye.com/topic/71175 对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程 ...
- OpenJDK将对Android开发产生怎样的影响?
转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/182.html?1456926201 Google已决定将从下一版本的Android开始采 ...
- 测试驱动开发(Test-Driven Development,简称TDD)--单元测试-->提高代码质量
!!! 1.估算和做项目计划时要算上单元测试时间 2.开发之前写单元测试代码 盖房子的时候,工人师傅砌墙,会先用桩子拉上线,以使砖能够垒的笔直,因为垒砖的时候都是以这根线为基准的.TDD就像这样,先写 ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
随机推荐
- BAT脚本入门
BAT脚本入门 echo:显示命令后的字符 chcp 65001: 就是换成UTF-8代码页 echo off: 此语句后的所有运行命令都不显示命令行语句 @:与echo off相似,但它加在每个命令 ...
- docker-compose可持续集成之jenkins
1.下载docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-co ...
- es6 Decorator修饰器
1.类的修饰: 修饰器(Decorator)函数,用来修改类的行为.修饰器是一个对类进行处理的函数.修饰器函数的第一个参数,就是所要修饰的目标类. @testable class MyTestable ...
- BitSet源码
public class BitSet1 implements Cloneable, java.io.Serializable { // >>>左边补0, << 右边补0 ...
- Laravel集成Swoole教程
1.准备工作 安装 Laravel laravel new laravel-swoole 本人使用 valet 进行开发,可以使用 laravel-swoole.test 进行访问 2 ...
- 027 ElasticSearch----全文检索技术02---快速入门
1.基本概念 Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的. 注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,E ...
- EXT.net 1.x TreePanel的一个坑
Ext.net TreePanel有一个方法 drptreepanel.setChecked({ ids: idsarray, silent: true }); 如果TreePanel里有1,3两个 ...
- LuoguP3069 【[USACO13JAN]牛的阵容Cow Lineup
题目链接 看了看其他大佬的文章,为什么要控制右端呢 其实就是一个很简单的模拟队列趴... 难点就在于根据题意我们可以分析得一段合法区间内,不同种类个数不能超过k+2 哦当然,由于种类数范围过大,要对种 ...
- English--动名词
English|动名词 开始动名词的学习,代表着在长难句的征途上又向前迈出了一步. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用 ...
- web项目文档总览
一个web项目的文档应该包含哪些部分 一.规范文档1.ui 设计规范2.js.css.html 编码规范3.后台程序编码规范4.文件层级及模块编码规范二.技术架构评审三.运行环境部署细则四.研发流程: ...