题目:串变换(蓝桥OJ 4360)

问题描述:


解题思路:

        题目说可以挑选任意个操作,因此我们枚举全部的子集。题目说以任意顺序执行,因此我们枚举每种子集的全排列。如果存在一种子集的一种排列可以使s变成t就返回yes并结束,反之,遍历完全部没有找到结果就输出No。

        注意点:1.枚举全排列方法:

sort(list.begin(), list.end());
do{//....  }while(next_permutation(list.begin(), list.end()));   

                       2.枚举子集的方法:二进制,k表示位数,也是元素总数。i:每种子集的二进制表示

for(int i = 0; i < (1 << k); i++){vector<int> list;  // vector放在局部变量位置,每次循环都会重置为空*,当放在全局变量位置就不会重置 for(int j = 0; j < k; j++){if((1 << j) & i)list.push(j);  // j就表示一种子集的其中一个元素,把全部元素放入数组就是一种子集   }
}

代码:

#include<bits/stdc++.h>
using namespace std;
int a[10][4];
string s, t;bool check(vector<int> list){  // 检查当前排列是否使S变为Tfor(int i: list){  // 进行操作的编号if(a[i][1] == 1){s[a[i][2]] = (s[a[i][2]] - '0' + a[i][3]) % 10 + '0';  // ascii执行操作1}else{swap(s[a[i][2]], s[a[i][3]]);}}//比较字符串if(t.find(s) != string::npos)return true;else return false;  // 要加个return,不然不会出现报错但有样例不过
}int main()
{int n;cin >> n;cin >> s >> t;int k;cin >> k;for(int i = 0; i < k; i++){cin >> a[i][1] >> a[i][2] >> a[i][3];}for(int i = 0; i < (1 << k); i++){vector<int> list;  // 存放每种子集for(int j = 0; j < k; j++){if((1 << j) & i)list.push_back(j);  // 123: 1, 12, 13....123(每次i循环一种子集)}sort(list.begin(), list.end());  // 全排列:需要先排序在使用next_permutationdo{if(check(list)){puts("Yes");return 0;}  }while(next_permutation(list.begin(), list.end()));  // 找到下一个排列可能}puts("No");return 0;
}

知识点:全排列,枚举子集,ascii

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 哈希表

一、哈希表的由来 我们的java程序通过访问数据库来获取数据&#xff0c;但是当我们对数据库所查询的信息进行大量分析后得知&#xff0c;我们要查询的数据满足二八定律&#xff0c;一般数据库的数据基本存储在磁盘当中。这使得每次查询数据将变得无比缓慢。为此我们可以将经常…

leetcode代码记录(第一个出现两次的字母

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给你一个由小写英文字母组成的字符串 s &#xff0c;请你找出并返回第一个出现 两次 的字母。 注意&#xff1a; 如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前&…

【随笔】Git 高级篇 -- 分离 HEAD(十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用

最终效果 文章目录 最终效果前言为什么使用CharacterControllerSimpleMove和Move如何选择&#xff1f;1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃方式一方式二 下蹲处理下坡抖动问题实现奔跑和不同移速控制完整代码补充&#xff0c;简单版本 实现物理碰…

很详细的单应矩阵分解R、t过程

很详细的单应矩阵分解R、t过程 附赠自动驾驶学习资料和量产经验&#xff1a;链接 已有多种方法将单应矩阵H分解为R、t&#xff0c;在《Deeper understanding of the homography decomposition for vision-based control》一文中介绍了三种方法&#xff1a; O. Faugeras and F.…

Docker实战教程 第1章 Linux快速入门

2-1 Linux介绍 为什么要学Linux 三个不得不学习 课程需要&#xff1a;Docker开发最好在Linux环境下。 开发需要&#xff1a;作为一个后端程序员&#xff0c;是必须要掌握Linux的&#xff0c;这是找工作的基础门槛。 运维需要&#xff1a;在服务器端&#xff0c;主流的大型服…

【操作系统】STM32-操作系统——持续更新

【操作系统】STM32-操作系统——持续更新 文章目录 前言一、ucosii二、freertos1.介绍2.移植 总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、ucosii UCOSII移植到STM32F103C8T6上之移植记录&#xff08;一&#xff09; UCOSII移植到ST…

C++之类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1访问限定符 4.2 类的两种定义方式 第一种&#xff1a; 第二种&#xff1a; 4.3封装 5.类的实例化 6.类对象模型 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;…

京东云服务器地域和可用区选择方法,多因素考虑攻略

京东云服务器地域如何选择&#xff1f;根据地理位置就近选择地域。京东云主机地域支持北京、宿迁、上海和广州&#xff0c;华北地区用户选择北京地域&#xff0c;华东地区用户可以选择上海或宿迁地区&#xff0c;南方用户选择广州地域。云服务器吧yunfuwuqiba.com整理京东云主机…

IP地址获取不到的原因是什么?

在数字化时代的今天&#xff0c;互联网已成为我们日常生活和工作中不可或缺的一部分。而IP地址&#xff0c;作为互联网通信的基础&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到IP地址获取不到的问题&#xff0c;这会给我们的网络使用带来诸多不便。那么&a…

BPMNJS 在原生HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不…

Spring源码分析(@Configuration)

文章目录 Spring源码分析&#xff08;Configuration&#xff09;一、ConfigurationClassPostProcessor1、主要作用和特点2、执行的时机3、BeanFactoryPostProcessor4、BeanDefinitionRegistryPostProcessor5、ConfigurationClassPostProcessor1&#xff09;postProcessBeanDefi…