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

这题的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. python_如何快速下载安装第三方库?

    如何快速下载安装第三方库? --通过 淘宝源  https://mirrors.aliyun.com/pypi/simple/ 本国网络进行快速安装 如何执行安装命令? pip install Dja ...

  2. MySQL如何选择合适的引擎以及引擎的转换。

    我们怎么选择合适的引擎?这里简单归纳一句话:"除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎." 除非万不得已,否则不建议混 ...

  3. js中键盘按键对应的键值

    js键盘键值 keycode    8 = BackSpace BackSpace  keycode    9 = Tab Tab  keycode   12 = Clear  keycode   1 ...

  4. 一个Android上的以滑动揭示的方式显示并切换图片的View

    SlideView是一个Android上的以滑动揭示的方式显示并切换图片的View,以视觉对比的方式把一套相似的图片展示出来. 示例 翻页图片揭示效果: 特性 设置一组(List<ImageIn ...

  5. JavaScript this浅析

    在做聊天室的过程中,我遇到了一个小问题,在javascrip中,有没有和c语言中的静态变量类似的对象呢? 答案就在闭包之中. 而说到闭包,又得说说那个我视之如地雷的this.this搞明白了,闭包这东 ...

  6. linux命令读取文件中特定行

    1.如果你只想看文件的前5行,可以使用head命令, 如: head -5 /etc/passwd 2.如果你想查看文件的后10行,可以使用tail命令, 如: tail -10 /etc/passw ...

  7. SpringBoot整合Redis、ApachSolr和SpringSession

    SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...

  8. 理解DNS

    理解DNS 写在前面: 目前,我们大部分的网络通信都是基于TCP/IP协议的,而TCP/IP又基于IP地址作为唯一标识进行通信,随着需要记忆的IP地址数量的增多,肯定会超出我们的记忆能力范围,但如果使 ...

  9. [DeeplearningAI笔记]ML strategy_2_2训练和开发/测试数据集不匹配问题

    机器学习策略-不匹配的训练和开发/测试数据 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.4在不同分布上训练和测试数据 在深度学习时代,越来越多的团队使用和开发集/测试集不同分布的数据来 ...

  10. web框架之Django基础

    1. Django的简介 Django是一个由python写成的开放源代码的Web应用框架. Django的目的是使常见的Web开发任务,快速和容易. 2. Django框架的特点 1. 遵循MVC开 ...