大致题意:每个多米诺骨牌可能横着,也可能竖着,请你判断有哪些合法的摆放方式。

这题的dfs需要注意一下,不能以某个点直接开始延伸,如果这样延伸可能会无法到达终点(也就是遍历全图)。我的dfs方法就是枚举每一行,一行枚举完了进入下一行。

AC代码:

#include<cstring>
#include<cstdio>
const int maxn=8;
int bone[maxn][maxn],pip[maxn][maxn],ans[maxn][maxn];
int vis[30];
int dx[]={0,1};
int dy[]={1,0};
void init(){
    int val=1;
    for(int i=0;i<=6;++i){
        for(int j=i;j<=6;++j)
            bone[i][j]=bone[j][i]=val++;
    }
}

int cnt=0;
void dfs(int d,int x,int y){
    if(d==28){
        cnt++;
        for(int i=0;i<7;++i){
            for(int j=0;j<8;++j){
                printf("  %2d",ans[i][j]);
            }
            printf("\n");
        }
        printf("\n\n");
        return;
    }
    if(y==8) {dfs(d,x+1,0);return;}
    if(ans[x][y]) {dfs(d,x,y+1);return;}
    for(int i=0;i<2;++i){
        int newx=x+dx[i],newy=y+dy[i];
        if(newx<0||newx>=7||newy<0||newy>=8) continue;
        if(ans[newx][newy]) continue;
        int v1=pip[x][y],v2=pip[newx][newy];
        int key=bone[v1][v2];
        if(vis[key]) continue;
        ans[x][y]=ans[newx][newy]=key;
        vis[key]=1;
        dfs(d+1,x,y+1);
        ans[x][y]=ans[newx][newy]=0;
        vis[key]=0;
    }
}

int main(){
    init();
    int e,kase=1;
    while(scanf("%d",&e)==1){
        if(kase>1) printf("\n\n\n");
        memset(vis,0,sizeof(vis));
        memset(ans,0,sizeof(ans));
        cnt=0;
        for(int i=0;i<7;++i)
        for(int j=0;j<8;++j){
            if(i==0&&j==0) pip[i][j]=e;
            else scanf("%d",&pip[i][j]);
        }

        printf("Layout #%d:\n\n\n",kase);
        for(int i=0;i<7;++i){
            for(int j=0;j<8;++j)
                printf("  %2d",pip[i][j]);
            printf("\n");
        }
        printf("\n");
        printf("Maps resulting from layout #%d are:\n\n\n",kase);
        dfs(0,0,0);
        printf("There are %d solution(s) for layout #%d.\n",cnt,kase++);
    }
    return 0;
}

如有不当之处欢迎指出!

uva211 回溯的更多相关文章

  1. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  2. jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack()

    了解了jQuery对DOM进行遍历背后的工作机制,可以在编写代码时有意识地避免一些不必要的重复操作,从而提升代码的性能 从这章开始慢慢插入jQuery内部一系列工具方法的实现 关于jQuery对象的包 ...

  3. linux中oops信息的调试及栈回溯【转】

    本文转载自:http://blog.csdn.net/kangear/article/details/8217329 ========================================= ...

  4. Java数据结构之回溯算法的递归应用迷宫的路径问题

    一.简介 回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法.当搜索到某个结点.发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结 ...

  5. 回溯 DFS 深度优先搜索[待更新]

      首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权!   1.概念   回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...

  6. 46. Permutations 回溯算法

    https://leetcode.com/problems/permutations/ 求数列的所有排列组合.思路很清晰,将后面每一个元素依次同第一个元素交换,然后递归求接下来的(n-1)个元素的全排 ...

  7. Js杂谈-正则的测试与回溯次数

    例子来源于<精通正则表达式(第三版)>这本书,我贴出来: 这里的NFA是正则的一种引擎,书中介绍了一共三种引擎:NFA,DFA和POSIX NFA.像一般我们常用的.NET,java.ut ...

  8. SDUT 1400 马的走法(回溯法)

    题目链接: 传送门 马的走法 Time Limit: 1000MS     Memory Limit: 65536K 题目描述 在一个4*5的棋盘上,马的初始位置坐标(纵 横)位置由键盘输入,求马能返 ...

  9. ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

    这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...

随机推荐

  1. iOS UImage 与 RGB 裸数据的相互转换

    iOS UImage 与 RGB 裸数据的相互转换 Touch the data of image in iOS Get data from a image 较简单,根据已有的 image 的属性,创 ...

  2. 解决publish不编译问题

    突然发现上午写的博客没了,是我没保存吗?再写一遍 eclipse下将项目部署到tomcat,run之后页面访问出现404,看日志没异常,但出现了No mapping found for HTTP re ...

  3. Redis+Springmvc搭建(附windows下安装)

    作者注:本文主要用于个人学习.同时欢迎交流讨论 1.添加maven依赖: <dependency>          <groupId>org.springframework. ...

  4. BSA Network Shell系列-runcmd/runscript命令

    runcmd和runscript ## 1 功能概述 runcmd/runscript:runcmd在一台或多台机器执行Network Shell命令(单个命令),而runscript执行的是脚本,二 ...

  5. java枚举 用于声明持久化常量 和volley 请求头

    在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public e ...

  6. Java基础知识(一)

    类与对象 1.对象:客观存在的一切事物称之为对象 类:具有相同属性和方法的对象的集合 2.类:属性,方法 3.修饰符: public protected  默认(不写)  private 任何地方   ...

  7. MySQL--当事务遇到DDL命令

    众所周知MySQL的DDL语句是非事务的,即不能对DLL语句进行回滚操作,哪在事务中包含DDL语句会怎样呢? 如: #禁用自动提交 set autocommit=off; #创建tb1 create ...

  8. 康盛(discuz )牛逼的PHP加解密算法函数

    1.前言 康盛的 authcode 函数很牛叉,是一个具有有效期的加解密函数,同一个字符每次加密所产生的结果都是不一致的,并且可以自定义设置过期时间. 设计原理:authcode 是使用异或运算进行加 ...

  9. Jmeter之性能测试类型

    pipe-clean test 在测试环境预先跑 确定脚本准确性 单用户跑 获取baseline   容量测试 经典的性能测试类型 获取系统稳定运行时最大的吞吐量/并发数/响应时间时 尽量模拟真实情况 ...

  10. [DeeplearningAI笔记]Multi-class classification多类别分类Softmax regression_02_3.8-3.9

    Multi-class classification多类别分类 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.8 Softmax regression 原有课程我们主要介绍的是二分分类( ...