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

这题的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. 提示让IE8以下版本的浏览器去更新浏览器

    需求: 强制让IE进行页面渲染时候,用最新的方式渲染,并提示让IE8以下的版本去更新浏览器并给一个连接地址 那,如何满足? <!DOCTYPE html> <html lang=&q ...

  2. 爬取西刺网代理ip,并把其存放mysql数据库

    需求: 获取西刺网代理ip信息,包括ip地址.端口号.ip类型 西刺网:http://www.xicidaili.com/nn/ 那,如何解决这个问题? 分析页面结构和url设计得知: 数据都在本页面 ...

  3. junit4X系列--Rule

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/12/377955.html.感谢作者的无私分享. 初次用文字的方式记录读源码的过程,不知道怎么 ...

  4. 解决跨站脚本注入,跨站伪造用户请求,sql注入等http安全漏洞

    跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞. sql注入 1.参数化查询预处理 ...

  5. 学Java分布式和高架构,必懂的两大知识点!

    今天小编为你们分享阿里巴巴2018年招聘应届毕业生,Java工程师的面试考题,主要分为三种 Java中获取 mysql连接的方式: 第一部分:分布式   三步变成:分布式 1.将你的整个软件视为一个系 ...

  6. crypto在web的使用

    前言 crypto 在nodejs中是一个核心模块,虽然现在高等浏览器中也有了crypto全局对象(下图),它在nodejs中的使用与web端还是不同的. web端使用cryptojs 国外下载较慢, ...

  7. <global-results>标签来定义全局的<result>

    <global-results> <result name="error">/Error.jsp</result>   <!--   Ac ...

  8. Linux安装JDK、MySQL和Tomcat

    1 依赖的安装 因为JDK.Tomcat和MySQL的安装过程中需要从网上下载部分支持包才可以继续,所以需要提前安装好依赖. yum install glibc.1686 yum -y install ...

  9. PHP与XML

    代码: <?php $dom= new DomDocument('1.0'); $books=$dom->appendChild($dom->createElement_x_x('b ...

  10. HTML——filedset和legend标签

    1.<filedset>定义围绕表单中元素的边框. 2.legend 元素表示作为 legend 元素的父元素的 fieldset 元素的其余内容的标题(caption). 使用案例: & ...