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+回溯) 的相关文章

  • 已安装的nginx,添加新模块fastdfs-nginx-module

    1 先看nginx的安装位置和运行目录 不清楚的可以使用命令查看 find name nginx 2 确定安装目录和运行目录后 查看当前nginx的安装路径及已安装的模块等信息 usr local nginx sbin nginx V 3
  • 欧拉回路路径求解

    基本概念 今天讨论的主题是一类问题 就是欧拉路问题 有两种欧拉路 第一种叫做 Eulerian path trail 沿着这条路径走能够走遍图中每一条边 第二种叫做 Eularian cycle 沿着这条路径走 不仅能走遍图中每一条边 而且
  • [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS

    目录 1 Binary Tree Level Order Traversal 二叉树层次遍历 BFS 2 Binary Tree Level Order Traversal II 二叉树层次遍历从低往高输出 BFS 3 Maximum De
  • 图的深度优先遍历

    深度优先查找 原理 深度优先搜索可以从图的任意顶点开始 然后把该顶点标记为已经访问 每次迭代的时候 深度搜索紧接着处理与当前顶点邻接的未访问顶点 如果有若干个顶点 则任意选择一个 也可以按自己的条件选择 让这个过程一直持续 直到遇到一个终点
  • 基础算法题——迷宫(递推)

    迷宫 题目链接 解题思路 暴力法 利用 dfs 遍历每一条可能的路径 将遍历的权值和不断取余 不足 当 n m 取较大的情况下 所遍历的路径可能会暴增 出现超时的情况 递推法 从题目上我们可以发现 最终的权值和是要对 mod 取余的 利用这
  • 关于multipartFile.transferTo方法报错java.nio.file.FileAlreadyExistsException

    之前老项目用的spring4版本 现在升级成spring5版本 重新把文件中心搬过来 发现原先有一段 MultipartFile multiFile XXX File file File createTempFile System curr
  • DFS(深度优先遍历)解题思路

    DFS主要可以用于解决三种问题 1 可达性 连通性问题 LeetCode上适用题目 695 查找最大的连通面积 200 矩阵中的连通分量数目 547 好友关系的连通分量数目 130 填充封闭区域 417 能到达的太平洋和大西洋的区域 2 排
  • 深度优先搜索算法(DFS)原理及示例详解

    目录 1 算法原理 2 基本思路 980 不同路径 题目描述 输入输出示例 直观思路 代码实现 1 算法原理 事实上 深度优先搜索属于图算法的一种 英文缩写为DFS即Depth First Search 其过程简要来说是对每一个可能的分支路
  • 剑指offer.13.机器人的运动范围之DFS、BFS搜索

    机器人的运动范围 前言 一 DFS 1 思想 2 源码 二 BFS 1 源码 2 改进源码BFS 总结 前言 对于矩阵搜索问题 就像图的搜索一样 熟练掌握DFS BFS是关键 一 DFS 1 思想 通过DFS去寻找满足条件的格子 而已经访问
  • [Codeforces 1286B] Numbers on Tree

    Evlampiy was gifted a rooted tree The vertices of the tree are numbered from 1 to n Each of its vertices also has an int
  • CentOS 7.9 64位 SCC版安装FastDfs和配置Nginx

    最近练习的项目中需要用到FastDfs 和Nginx 这里记录一下安装和配置过程 个人使用部署过程遇到了很多的坑 准备把过程记下来不然忘了 首先 购买 试用阿里云 CentOS 7 9 64位Scc版系统 进入远程桌面 由于项目较老 所以我
  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • 题目 1548: [蓝桥杯][算法提高VIP]盾神与砝码称重

    时间限制 1Sec 内存限制 128MB 提交 782 解决 331 题目描述 有一天 他在宿舍里无意中发现了一个天平 这 个天平很奇怪 有n个完好的砝码 但是没有游码 盾神为他的发现兴奋不已 于是他准备去称一称自己的东西 他准备好了m种物
  • 【算法】深度优先搜索DFS 入门:基本知识+经典例题

    DFS最重要的是理清搜索顺序 ps 这是我入门dfs时写的博客 后来dfs渐渐熟练了 也补充了一些题目上去 带原题和代码 个人感觉整篇博文从上到下确实由易到难 代码也由开始的冗长变得渐渐精简 自学DFS看的视频 小甲鱼 讲原理 青岛大学 王
  • Fix a Tree【Codeforces 699 D】【dfs + 树的性质】

    Codeforces Round 363 Div 2 D 题意 有N个点 每个点i都有一个父节点p i 如果 i p i 则是说明i结点是根结点 现在我们给出这样的1 N的p i 这可能是不合法的 问 我们应该最少改变多少个使它变成一棵合法
  • Acwing 842. 排列数字

    dfs int u 搜索第u个位置上可以放哪个数字 include
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner
  • 数据结构--树存储结构 & 深度优先遍历 & 广度优先遍历 通俗易懂

    树的概念 首先 树是一种常用的非线性数据结构 是以边 Edge 相连的节点 Node 的集合 每个节点存储对应的值 当存在子节点时与之相连 根节点 是树的首个节点 边 所有节点都由边相连 用于标识节点间的关系 叶子结点 树的末端节点 它们没
  • CSS:创建凸起框效果的好方法是什么?

    也就是说 元素的左边框和下边框需要提供弹出的 3D 效果 有没有一种好的 纯 CSS 的方法来实现这种效果 foo border 8px outset 999 webkit box shadow 5px 5px 15px rgba 0 0
  • WebGL绘制带深度图的2D图像实现伪3D效果

    我正在学习 WebGL 是在 WebGLFundamentals 页面的帮助下完成的 这帮助我很好地理解了缓冲区 着色器和所有这些东西的工作原理 但现在我想达到我在这里看到的某种效果 https tympanus net Tutorials

随机推荐

  • 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组合组成