UVa 211 The Domino Effect 多米诺效应 暴力搜索

news2024/11/17 1:45:48

题目链接:UVa 211 The Domino Effect
题目描述:

一张多米诺骨牌拥有两个数值,一共有二十八张不同的多米诺骨牌,这二十八张多米诺骨牌的点数如下图所示:
在这里插入图片描述
上图的 B o n e Bone Bone代表编号,而 P i p s Pips Pips代表两个数值。现在输入给定 7 7 7 8 8 8列数据,保证输入的数据一定是上述多米诺骨牌的牌值,你需要用上述 28 28 28张(每张牌用且只用一次)多米诺骨牌(骨牌可以横着摆或者竖着摆)来还原这个输入数据,你需要输出所有可能的摆放方式。

题解:

这道题我们的想法是:每次选择两个没有组合的数字组成一张多米诺骨牌,要保证组合成的多米诺骨牌没有被其他地方的数字使用过,如果最后能够将所有的数字都进行组合,那么就得到了一种可能的答案。
那么如何搜索呢?可以从 ( 0 , 0 ) (0, 0) (0,0)位置开始进行搜索,每次搜索的时候我们尝试将当前位置和右边的数字或者下边的数字组成一张多米诺骨牌,然后下一次搜索的位置变为当前位置向右移动一个,当然这样进行搜索的话右边的左边的数字可能已经被使用过了,所以我们在右边坐标数字被使用过的情况下只需要再往右边进行搜索,知道右边的数字没有被使用或者当前已经到达最右边了,但是还是被使用了,那么我们直接到下一行进行搜索即可。那么这样搜索的深度是 58 58 58并且每层最多有 2 2 2个选择,这样似乎复杂度不允许我们通过。但是这样得到的一个搜索树是稀疏的,因为当某一个位置确定了之后随即就有另一个位置确定,那么搜索结点个数应该是不超过 2 29 2^{29} 229
注意:这道题的输出格式比较复杂,最后一组的输出末尾应该只有一个换行,可以先参看输出格式。

代码:

#include <bits/stdc++.h>

const int NUM_DIRECTION = 2;
const int ROW_NUM = 7;
const int COLUMN_NUM = 8;

using namespace std;

int ansNum, caseID;
int ans[ROW_NUM][COLUMN_NUM], used[ROW_NUM * COLUMN_NUM + 1], number[ROW_NUM][COLUMN_NUM], id[7][7];
int dx[] = {0, 1};
int dy[] = {1, 0};

bool getInput()
{
    for (int i = 0; i < ROW_NUM; i++) {
        for (int j = 0; j < COLUMN_NUM; j++) {
            if (!(cin >> number[i][j])) { return false; };
        }
    }
    return true;
}

void init()
{
    ansNum = 0;
    memset(ans, 0, sizeof(ans));
    memset(used, 0, sizeof(used));
}

void dfs(int x, int y, int nowDepth)
{
    if (nowDepth == ROW_NUM * COLUMN_NUM) {
        for (int i = 0; i < ROW_NUM; i++) {
            for (int j = 0; j < COLUMN_NUM; j++) {
                cout << setw(4) << ans[i][j];
            }
            cout << endl;
        }
        cout << endl << endl;
        ansNum++;
        return;
    }
    if (y == COLUMN_NUM) {
        x++;
        y = 0;
    }
    if (ans[x][y] != 0) {
        dfs(x, y + 1, nowDepth + 1);
        return;
    }
    for (int i = 0; i < NUM_DIRECTION; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx >= ROW_NUM || ny >= COLUMN_NUM || ans[nx][ny] != 0 || used[id[number[x][y]][number[nx][ny]]]) { continue; }
        ans[x][y] = ans[nx][ny] = id[number[x][y]][number[nx][ny]];
        used[id[number[x][y]][number[nx][ny]]] = true;
        dfs(x, y + 1,  nowDepth + 1);
        ans[x][y] = ans[nx][ny] = 0;
        used[id[number[x][y]][number[nx][ny]]] = false;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    int cnt = 1;
    for (int i = 0; i < 7; i++) {
        for (int j = i; j < 7; j++) {
            id[i][j] = id[j][i] = cnt++; // 记录每种Domino的编号
        }
    }
    while (getInput()) {
        if (caseID) { cout << endl << endl << endl << endl << endl; }
        caseID++;
        cout << "Layout #" << caseID << ":" << endl << endl << endl;
        for (int i = 0; i < ROW_NUM; i++) {
            for (int j = 0; j < COLUMN_NUM; j++) {
                cout << setw(4) << number[i][j];
            }
            cout << endl;
        }
        cout << endl << "Maps resulting from layout #" << caseID << " are:" << endl << endl << endl;
        init();
        dfs(0, 0, 0);
        cout << "There are " << ansNum << " solution(s) for layout #" << caseID << "." << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot扩展点系列之终结篇:Bean的生命周期

前言关于Springboot扩展点系列已经输出了13篇文章&#xff0c;分别梳理出了各个扩展点的功能特性、实现方式和工作原理&#xff0c;为什么要花这么多时间来梳理这些内容&#xff1f;根本原因就是这篇文章&#xff1a;Spring bean的生命周期。你了解Spring bean生命周期&#xf…

前端最全面试题整理

前端基础 一、 HTTP/HTML/浏览器 1、说一下 http 和 https https 的 SSL 加密是在传输层实现的。 (1) http 和 https 的基本概念 http: 超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;T…

操作SSH无密登录配置

例如小编有三台服务器需要相互访问&#xff0c;就需要配置三台&#xff0c;这三台分别是hadoop102,hadoop103 , hadoop1041.打开三个服务器&#xff0c;分别生成hadoop102&#xff0c;hadoop103 , hadoop104的公钥和私钥输入命令&#xff0c;然后一直回车&#xff0c;这时候什么…

狂神聊Redis复习笔记二

目录事务监控&#xff01; Watch &#xff08;面试常问&#xff01;&#xff09;悲观锁&#xff1a;乐观锁&#xff1a;Redis测监视测试Redis.conf详解Redis持久化RDB&#xff08;Redis DataBase&#xff09;AOF&#xff08;Append Only File&#xff09;Redis发布订阅Redis主从…

Docker资源隔离(namespace,cgroups)

一、概述 Docker容器的本质是宿主机上的一个进程。Docker通过namespace实现了资源隔离&#xff0c;通过cgroups实现了资源限制&#xff0c;通过写时复制机制&#xff08;copy-on-write&#xff09;实现了高效的文件操作。 二、Linux内核的namespace机制 namespace 机制提供一种…

jfr引起的一次jvm异常记录

业务生产启动时&#xff0c;20个节点有1-2个节点因为jvm问题出现启动失败&#xff0c;k8s自动重启后正常。在测试环境2个节点下偶现 排查思路&#xff1a; 先拿到hs_err_pid的jvm错误文件找到当前线程和内部错误信息 hs_err_pid 文件分析 当前线程&#xff1a;lettuce的线程…

使用Robot Framework实现多平台自动化测试

目录 前言 1、设计目标 2、架构设计 3、平台实现 4、平台的创新点 5、平台的实施效果 6、总结 重点&#xff1a;配套学习资料和视频教学 前言 基于Robot Framework、Jenkins、Appium、Selenium、Requests、AutoIt等开源框架和技术&#xff0c;成功打造了通用自动化测试…

各数据库数据类型的介绍和匹配

各数据库数据类型的介绍和匹配1. Oracle的数据类型2. Mysql的数据类型3. Sql server的数据类型4. 类型匹配5. Awakening1. Oracle的数据类型 数据类型介绍 VARCHAR2 :可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749&#xff1b; NCHAR :根据字符集而定的固定长度字…

微服务架构的演变

文章目录1.1 系统架构的演变过程1.1.1 单体应用架构1.1.2 垂直应用架构1.1.3 分布式架构1.1.4 SOA架构1.1.5 微服务架构1.2 微服务架构设计原则1.2.1 AKF拆分原则1.2.1.1 X轴扩展&#xff08;水平复制&#xff09;1.2.1.2 Y轴扩展&#xff08;模块拆分&#xff09;1.2.1.3 Z轴扩…

【SSM】Spring对IoC的实现方式DI详讲

控制反转的一种实现方式——依赖注入一、IoC 控制反转&#xff08;Overview&#xff09;依赖注入&#xff08;DI&#xff09;- Overview利用 IoC&#xff08;控制反转&#xff09;这种思想有什么好处呢&#xff1f;二、依赖注入的方式setter 方式&#xff08;xml配置中的proper…

Java JSR规范列表

Java JSR规范列表目录概述需求&#xff1a;设计思路实现思路分析1.JSR2.JSR方法3.web service4.Webservice:5.数据处理器拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,m…

JavaWeb-连接数据库实现用户登录、注册、修改密码(全代码)

上一篇博客中我通过使用HttpServlet完成一个假登录&#xff0c;这篇博客我将通过JDBC连接数据库&#xff0c;使其实现简单的用户登录、注册以及更改密码一、MySQL:MySQL部分代码&#xff1a;-- ---------------------------- -- Table structure for users -- ----------------…

WSL(ubuntu2204)使用xfce4桌面打不开语言支持及配置WSL服务自启

语言支持报错 在图形桌面或命令行打开语言支持报错&#xff1a;dbus.exceptions.DBusException: org.freedesktop.DBus.Error.FileNotFound: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory itboonelocalhost:/$ sudo /usr/bin/gnome-…

【SCL】1200案例:天塔之光数码管显示液体混合水塔水位

使用scl编写天塔之光&数码管显示&液体混合&水塔水位 文章目录 目录 文章目录 前言 一、案例1&#xff1a;天塔之光 1.控制要求 2.编写程序 3.效果 二、案例2&#xff1a;液体混合 1.控制要求 2.编写程序 三、案例3&#xff1a;数码管显示 1.控制要求 2.编写程序 3…

转载:项目分析信息方法论

转载一篇最近看到的项目分析信息法&#xff1a;如何快速分析项目和如何详细分析项目。 一、如何快速分析项目&#xff1f; 可以从6个点进行分析&#xff0c;分别是&#xff1a;「流量效率&#xff0c;销转效率&#xff0c;交付效率&#xff0c;客单价&#xff0c;毛利率&…

【程序化天空盒】过程记录02:云扰动 边缘光 消散效果

写在前面 写在前面唉&#xff0c;最近筋疲力竭&#xff0c;课题组的东西一堆没做&#xff0c;才刚刚开始带着思考准备练习作品&#xff0c;从去年5月份开始到现在真得学了快一年了&#xff0c;转行学其他的真的好累&#xff0c;&#xff0c;不过还是加油&#xff01; 下面是做…

zlib压缩原理

数据压缩的本质 去除数据中的冗余信息&#xff0c;对于ABABABABABABAB字样的字符串&#xff0c;AB出现了7次&#xff0c;占用14个字节&#xff0c;如果将该字符串编码为7AB&#xff0c;只占用3个字节。 为什么需要对数据压缩 数据需要存储或者传输&#xff0c;为了节省磁盘空…

ONNXRUNTUIME实例分割网络说明

ONNXRUNTUIME c使用&#xff08;分割网络&#xff09;与相关资料&#xff08;暂记&#xff09; initiate a env with an id name(使用id名称启动env) create session (创建会话 ) onnxenv -> sessioninputname [“x”] ,outputname [“t”]inputnodedim [[1,1,192,192…

Linux单一服务管理systemctl

基本上systemd这个启动服务机制只有systemctl命令来处理&#xff0c;所以全部的操作都需要使用systemctl systemctl管理单一服务 一般来说服务的启动有两个阶段&#xff0c;一个是开机是否启动&#xff0c;以及现在是否启动 systemctl【command】【unit】 command主要有&…

VS2017+OpenCV4.5.5 决策树-评估是否发放贷款

决策树是一种非参数的监督学习方法&#xff0c;主要用于分类和回归。 决策树结构 决策树在逻辑上以树的形式存在&#xff0c;包含根节点、内部结点和叶节点。 根节点&#xff1a;包含数据集中的所有数据的集合内部节点&#xff1a;每个内部节点为一个判断条件&#xff0c;并且…