C - The Domino Effect(dfs+回溯)

2023-05-16

作者:JF

题目描述

一组标准的双六多米诺骨牌包含28块骨牌(称为骨头),每个骨牌使用类似骰子的点子显示从0(空白)到6的两个数字。28块独特的骨骼由以下PIP组合组成:

一组中的所有双六个多米诺骨牌都可以布置成7×8的像素网格。每个布局至少对应一张多米诺骨牌的“地图”。地图由相同的7×8网格组成,用适当的骨骼编号替换该骨骼上出现的pip编号。PIP的7×8网格显示示例和相应的骨骼编号地图如下所示。

编写一个程序,分析一组标准多米诺骨牌的任何7×8布局中的PIP模式,并生成一张地图,显示所有多米诺在该集中的位置。如果多米诺骨牌的多个排列产生相同的图案,您的程序应该生成每个可能布局的地图。

题目有多组数据,每组数据由7行8个从0到6的整数组成,输出原数据和对应可能的所有布局和数量。不同问题集的输出之间至少跳过三行,而同一问题集中的标签、每个打印和地图之间至少有一行。详见输出样例。

输入输出样例

输入

输出

 思路

从起点(0,0)开始往右和往下搜索,当搜索到最右边时,从下一行的最左边重新开始搜索,根据搜索到的两个数字得到对应的骨牌序号,判断下该骨牌序号是否使用过,若没有使用过则添加到答案数组中,继续往下搜索。当搜索完成后,检查是不是每个位置上都有了骨牌序号,是的话这就是一组解,输出该解,否则回溯。

 注意点

1.数据初始化,回溯时将use和ans恢复原样。

2.读入数据先读入一个判断是否还有数据,然后读入剩下的55个

3.进入dfs后判断当前坐标是否有数据,有数据则继续dfs但d的值不变

4.注意输出的格式,每个案例结果空三行,否则直接WA,不会提示PE!!!

AC代码

#include <bits/stdc++.h>
using namespace std;
int pic[10][10];  //存输入数据
int ans[10][10];  //存输出数据
bool use[30];    //判断骨牌序号是否使用过
int dx[]={0,1};  //移动x坐标
int dy[]={1,0};  //移动y坐标
int cnt=0;      //记录答案数量
int num[10][10];  //存放各个pip对应的骨牌序号值
void read()  //读取输入
{
    for(int i=1;i<8;i++)  //第一个数据已经读入,从第二个开始
        cin>>pic[0][i];
    for(int i=1;i<7;i++)
        for(int j=0;j<8;j++)
            cin>>pic[i][j];
}

void print_pic()  //输出原有数据
{
    for(int i=0;i<7;i++)
    {
        for(int j=0;j<8;j++)
        {
            printf("    %d",pic[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
bool check() {     //判断ans数组中是否都有赋过值
    for(int i = 0; i < 7; i++) {
        for(int j = 0; j < 8; j++) {
            if(ans[i][j] == -1) return false;
        }
    }
    return true;
}

void dfs(int d,int maxd,int x,int y)  //d为当前使用的骨牌个数,maxd为最大数量,x,y为坐标
{
    if(d==maxd){
        if(check()){   //判断当前结果是否可行,可行输出,否则回溯
            cout << endl;
            for(int i = 0; i < 7; i++) {
                for(int j = 0; j < 8; j++) {
                    printf("%4d",ans[i][j]);
                }
                cout << endl;
            }
            cnt++;
            cout<<endl;
        }
        return;
    }
    if(y==8){   //搜索到最右边,换行从最左侧搜索
        x++;
        y=0;
    }
    if(ans[x][y]!=-1)  //若已经有数据,继续往下搜索,d不变
    {
        dfs(d,maxd,x,y+1);
        return;
    }
    int xx,yy;  //搜索到的下一个位置的坐标
    for(int i=0;i<2;i++)
    {
        xx=x+dx[i];
        yy=y+dy[i];
        if(xx<0||xx>=7||yy<0||yy>=8) continue; //坐标越界
        if(ans[xx][yy]!=-1) continue;   //已有数据,继续往下搜索
        int c1=pic[x][y],c2=pic[xx][yy];  //c1,c2为两个坐标对应的值
        int c=num[c1][c2];   //根据c1,c2的值得到骨牌的序号c
        if(!use[c])  //判断是否使用过该骨牌
        {
            ans[x][y]=ans[xx][yy]=c;   //将搜索到的连个位置赋为c;
            use[c]=true;    //更新use数组;
            dfs(d+1,maxd,x,y+1);  //继续往下搜索
            use[c]= false;   //恢复原样
            ans[x][y]=ans[xx][yy]=-1;  //恢复原样 
        }
    }

}

int main()
{
    int Case=0;  //当前第几组数据
    int k=1;   //用于枚举骨牌序号
    for(int i=0;i<=6;i++)
        for(int j=i;j<=6;j++)
            num[i][j]=num[j][i]=k++;   //初始化,将pip组合对应的值存到数组num中
    while(cin>>pic[0][0]) {     //判断是否还有元素
        cnt = 0;
        if (Case) printf("\n\n\n\n");
        cout << "Layout #" << ++Case << ":\n\n\n";
        memset(use, 0, sizeof(use));  //初始化
        memset(ans,-1,sizeof(ans));
        read();         //读入数据
        print_pic();     //打印原数据
        cout << "Maps resulting from layout #" << Case << " are:\n\n";
        dfs(0,28,0,0);  
        cout << "\nThere are "  << cnt << " solution(s) for layout #"  << Case << ".\n";
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C - The Domino Effect(dfs+回溯) 的相关文章

  • 【数据结构与算法学习】图的深度优先遍历(DFS算法)

    目录 一 什么是图的遍历 二 深度优先遍历 DFS 的基本思想 三 深度优先遍历 DFS 的步骤详解 四 深度优先遍历 DFS 的代码实现 一 什么是图的遍历 图的遍历 指的是从图中的任一顶点出发 对图中的所有顶点访问一次且只访问一次 图的
  • 学渣带你刷Leetcode0017. 电话号码的字母组合

    题目描述 给定一个仅包含数字 2 9 的字符串 返回所有它能表示的字母组合 给出数字到字母的映射如下 与电话按键相同 注意 1 不对应任何字母 示例 输入 23 输出 ad ae af bd be bf cd ce cf 说明 尽管上面的答
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • UVA12166 Equilibrium Mobile

    VJ传送门 一道思维题 刚开始看的时候没什么思路 在博客园上参考了大佬的解析 在这里总结一下 一 分析 这道题要求让天平平衡所需要的最小改动次数 至少有一个不变 我们可以先选定一个不变的基准 然后改变其他的秤砣 得到以此为基准的天平的总重量
  • 图论 笔记

    关于存图 如果是有权值的边 可以用pair define pii pair
  • 【算法】蓝桥杯dfs深度优先搜索之凑算式总结

    本文 算法 蓝桥杯dfs深度优先搜索之凑算式总结 相关文章 算法 蓝桥杯dfs深度优先搜索之排列组合总结 算法 蓝桥杯dfs深度优先搜索之图连通总结 前言 曾几何时这个词现在用正适合不过了 曾几何时我还是对dfs算法一脸懵x的状态 虽说大二
  • poj 3074 Sudoku

    Time Limit 1000MS Memory Limit 65536K Total Submissions 7613 Accepted 2696 Description In the game of Sudoku you are giv
  • 深度优先搜索算法(DFS)原理及示例详解

    目录 1 算法原理 2 基本思路 980 不同路径 题目描述 输入输出示例 直观思路 代码实现 1 算法原理 事实上 深度优先搜索属于图算法的一种 英文缩写为DFS即Depth First Search 其过程简要来说是对每一个可能的分支路
  • LeetCode-116.填充每个节点的下一个右侧节点指针、深度优先搜索

    题目分析 广度优先搜索 题目要求把二叉树中每一层的的节点连起来 最简单的方法即 BFS 按层的顺序的对树进行遍历 但需要使用 queue 数据结构 空间复杂度为 O N 不符合题目要求 深度优先搜索 由于 next 指针的存在 可以实现对二
  • 岛屿类-网格类问题-DFS

    本文讲解200 岛屿数量问题 属于常见的岛屿类 网格类问题 本题使用DFS的思想 1 题目 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地
  • linux下载安装搭建、卸载FastDfs文件服务器、配置多存储路径(轮询、最大内存选择)、nginx反向代理实现图片预览、常用命令

    linux下载安装搭建 卸载FastDfs文件服务器 配置多存储路径 轮询 最大内存选择 nginx反向代理实现图片预览 常用命令 Springboot整合Fastdfs上传图片 缩略图 下载文件 需求 文件转存方案 springboot整
  • 图的深度优先遍历:DFS遍历

    图的深度优先遍历 DFS遍历 提示 系列图的文章 提示 大厂笔试面试都可能不咋考的数据结构 图 由于图的结构比较难 出题的时候 很难把这个图的数据搞通顺 而且搞通顺了题目也需要耗费太多时间 故笔试面试都不会咋考 笔试大厂考的就是你的贪心取巧
  • L2-2 病毒溯源 (25 分)(Dfs详细解析)

    病毒容易发生变异 某种病毒可以通过突变产生若干变异的毒株 而这些变异的病毒又可能被诱发突变产生第二代变异 如此继续不断变化 现给定一些病毒之间的变异关系 要求你找出其中最长的一条变异链 在此假设给出的变异都是由突变引起的 不考虑复杂的基因重
  • 不同岛屿的数量

    694 不同岛屿的数量 这道题要给出不同岛屿的数量 最直观的想法就是对发现的不同岛屿进行序列化 然后把序列化结果存到HashSet 那怎么序列化呢 其实比较类似于二叉树的序列化 记录遍历顺序 方向 这里用 1 2 3 4 代表上下左右 1
  • Knight Moves_dfs_2018_3_10

    A friend of you is doing research on the Traveling Knight Problem TKP where you are to find the shortest closed tour of
  • 无向图染色问题-dfs剪枝

    无向图染色问题 问题描述 给定一个无向图 要求用最少的颜色将节点染色 限制是不能让相邻节点染上相同的颜色 算法 使用dfs 为节点分配不同的颜色进行尝试 计算每种分配所需的颜色数 最终进行回溯 取得最小的颜色数 代码 C include
  • 迷宫问题java老鼠走迷宫(回溯法,递归,二维数组)(超级容易理解)

    回溯法迷宫问题 思路 利用回溯法和递归思想解决 findWay 方法就是专门来找出迷宫的路径 如果找到 就返回 true 否则返回 false map 就是二维数组 即表示迷宫 i j 就是老鼠的位置 初始化的位置为 1 1 因为我们是递归
  • 数据结构--树存储结构 & 深度优先遍历 & 广度优先遍历 通俗易懂

    树的概念 首先 树是一种常用的非线性数据结构 是以边 Edge 相连的节点 Node 的集合 每个节点存储对应的值 当存在子节点时与之相连 根节点 是树的首个节点 边 所有节点都由边相连 用于标识节点间的关系 叶子结点 树的末端节点 它们没
  • 在画布上挥动文字

    我怎样才能在画布元素上制作类似于上找到的文本this http www pageplugins com generators crazy text textwave php page EDIT Ben 忘记对你的问题无缘无故的反对票 并且
  • 如何同时执行多个 jquery 效果?

    我正在页面上制作一些错误 验证元素的动画 我希望它们能够弹跳并突出显示 但如果可能的话 同时进行 这是我目前正在做的事情 var els errorMsg els effect bounce times 5 100 els effect h

随机推荐

  • setDaemon python守护进程,队列通信子线程

    使用setDaemon 和守护线程这方面知识有关 xff0c 比如在启动线程前设置thread setDaemon True xff0c 就是设置该线程为守护线程 xff0c 表示该线程是不重要的 进程退出时不需要等待这个线程执行完成 这样
  • 中文与 \u5927\u732a\u8e44\u5b50 这一类编码互转

    了解更多关注微信公众号 木下学Python 吧 a 61 39 大猪蹄子 39 a 61 a encode 39 unicode escape 39 print a 运行结果 xff1a b 39 u5927 u732a u8e44 u5b
  • python字典删除键值对

    https blog csdn net uuihoo article details 79496440
  • 计算机网络(4)传输层

    目录 小知识点 xff1a 三次握手 xff1a 状态 xff1a tcpdump xff1a 一 xff1a 命令介绍 xff1a 二 xff1a 命令选项 xff1a tcpdump的表达式 xff1a 使用python扫描LAN工具
  • MSE 治理中心重磅升级-流量治理、数据库治理、同 AZ 优先

    作者 xff1a 流士 本次 MSE 治理中心在限流降级 数据库治理及同 AZ 优先方面进行了重磅升级 xff0c 对微服务治理的弹性 依赖中间件的稳定性及流量调度的性能进行全面增强 xff0c 致力于打造云原生时代的微服务治理平台 前情回
  • TF多层 LSTM 以及 State 之间的融合

    第一是实现多层的LSTM的网络 第二是实现两个LSTM的state的concat操作 分析 state 的结构 对于第一个问题 之前一直没有注意过 看下面两个例子 在这里插入代码片 import tensorflow as tf num u
  • 实例讲解PMP相关方参与度评估矩阵

    在规划相关方参与计划过程中 xff0c 会用到相关方参与度评估矩阵 如下图所示 在上图中 xff0c C 代表每个相关方的当前参与水平 xff0c D 是项目团队评估出来的 为确保项目成功所必不可少的参与水平 xff08 期望的 xff09
  • 在Mac OS中安装 wget

    先从Apple Store下载Xcode xff0c 然后安装Xcode 接着安装Homebrew包管理 xff0c 类似于Ubuntu下的apt get xff0c 终端下输入 xff1a ruby span class hljs ope
  • 前端与产品经理配合

    产品经理PM职业介绍 如何构建原型图 axure软件
  • C++ 重载运算符

    C 43 43 重载运算符号 本文针对结构体重载运算符号进行讲解 其实这是一个困扰我蛮久的问题 xff0c 就是结构体如何使用sort函数进行排序 xff0c 去网上找了很多 xff0c 满多都是关于类的 xff0c 虽然类跟结构体只有访问
  • &运算符的用法

    按位与运算符 34 amp 34 是双目运算符是参与运算的两数各对应的二进位相与 按位与 34 amp 34 功能是参与运算的两数各对应的二进位相与 只有对应的两个二进位均为1时 xff0c 结果位才为1 xff0c 否则为0 参与运算的数
  • 火柴棒游戏(暴力枚举)C++

    暴力枚举 P1149 NOIP2008 提高组 火柴棒等式 题目描述 xff1a 给你n根火柴棍 xff0c 你可以拼出多少个形如 A 43 B 61 CA 43 B 61 C 的等式 xff1f 等式中的AA BB CC是用火柴棍拼出的整
  • 2021蓝桥杯B组 G题砝码称重

    题目大意 xff1a 解法一 xff1a 首先想到的是可以用广度优先搜索的方式来进行暴力求解 xff0c 通过使用递归来将每一种方法遍历 xff0c 并且标记 xff0c 不过由于此方法的时间复杂度是O n3 故使用暴力搜索只能完成50 的
  • 2021蓝桥杯B组 第I题杨辉三角形

    第I题 杨辉三角形 题目大意 xff1a 解法一 xff1a xff08 得20 xff09 思路 xff1a 当指考虑小范围的值时 xff0c 我们可以直接根据杨辉三角形的规律 xff1a 第i行第j列的值 61 第i 1行第j列的值 4
  • Docker--安装Docker和简单使用

    1 docker的安装 1 首先先有一台配置高的虚拟机 xff08 至少两核四G xff09 2 按官方文档 Install Docker Engine on CentOS Docker Documentation 删除docker软件包
  • 力扣 1697. 检查边长度限制的路径是否存在

    给你一个 n 个点组成的无向图边集 edgeList xff0c 其中 edgeList i 61 ui vi disi 表示点 ui 和点 vi 之间有一条长度为 disi 的边 请注意 xff0c 两个点之间可能有 超过一条边 给你一个
  • c++stl 学习心得

    一 c 43 43 和c的区别 xff1a 1 函数默认值 在C 43 43 中我们在定义或声明一个函数的时候 xff0c 有时会在形参中给它赋一个初始值作为不传参数时候的缺省值 xff0c 例如 xff1a int is xff08 in
  • LeetCode 189.轮转数组 (双指针)

    题目传送门 xff1a 轮转数组 题目详情 xff1a 给你一个数组 xff0c 将数组中的元素向右轮转 k 个位置 xff0c 其中 k 是非负数 示例 1 输入 nums 61 1 2 3 4 5 6 7 k 61 3 输出 5 6 7
  • P1005 [NOIP2007 提高组] 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏 xff1a 对于一个给定的 n m 的矩阵 xff0c 矩阵中的每个元素 ai j 均为非负整数 游戏规则如下 xff1a 每次取数时须从每行各取走一个元素 xff0c 共 n 个 经过 m 次后
  • C - The Domino Effect(dfs+回溯)

    作者 xff1a JF 题目描述 一组标准的双六多米诺骨牌包含28块骨牌 xff08 称为骨头 xff09 xff0c 每个骨牌使用类似骰子的点子显示从0 xff08 空白 xff09 到6的两个数字 28块独特的骨骼由以下PIP组合组成