csu 1536 Bit String Reordering(模拟 bfs+状态压缩)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536
题意: 输入n个只为 0或1 的数 形成一个排列
再输入m个数 每个数代表 目标排列
(样例
1 0 0 1 0 1 1 3 2 目标排列有可能为 1 0 0 0 1 1 或 0 1 1 1 0 0 ) 每次只能移动相邻的数
问最少几步达到
思路:1 纯模拟
对目标串分类讨论
如果起始串和目标串上对应位置数字不一样
swap(b[j],b[i]);
ans+=j-i;
2 bfs+状态压缩
将起始串和两种可能的目标串状压
并bfs相邻状态 记录步数
达到目标串状态时 输出结果
模拟:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAXN=20;
int a[MAXN],b[MAXN],num[MAXN],temp[MAXN],ans;
void swap(int &a,int &b)
{int temp;temp=a;a=b;b=temp;
}
int min(int a,int b)
{if(a>b) return b;else return a;
}
int main()
{int n,m,num0=0,num1=0,res1=0,res2=0;int minn=0x3f3f3f3f;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==1) num1++;if(a[i]==0) num0++;}for(int i=1;i<=m;i++){scanf("%d",&temp[i]);if(i%2==1) res1+=temp[i];if(i%2==0) res2+=temp[i];}if(res1==num1){ans=0;memset(b,0,sizeof(b));for(int i=1;i<=n;i++) num[i]=a[i];int flag=1,cnt=1;for(int i=1;i<=m;i++){for(int j=1;j<=temp[i];j++)b[cnt++]=flag;flag=!flag;}for(int i=1;i<=n;i++){if(num[i]==b[i]) continue;else{for(int j=i+1;j<=n;j++){if(b[j]==!b[i]){swap(b[j],b[i]);ans+=j-i;break;}}}}minn=min(ans,minn);}if(res1==num0){ans=0;memset(b,0,sizeof(b));for(int i=1;i<=n;i++) num[i]=a[i];int flag=0,cnt=1;for(int i=1;i<=m;i++){for(int j=1;j<=temp[i];j++)b[cnt++]=flag;flag=!flag;}for(int i=1;i<=n;i++){if(num[i]==b[i]) continue;else{for(int j=i+1;j<=n;j++){if(b[j]==!b[i]){swap(b[j],b[i]);ans+=j-i;break;}}}}minn=min(ans,minn);}printf("%d\n",minn);return 0;
}
bfs+状态压缩
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#define N 1000005
#define lson o<<1, l, m
#define rson o<<1|1, m + 1, r
#define mod 1000000007
using namespace std;
typedef long long LL;int n,m;
int vis[100050];
int a[20],b[20],c[20];
int ans[2];
int st;int bfs()
{int pre[100005];int begin = 0,end = 1;pre[0] = st;int t[100006];t[0] = 0;while(begin < end){int w = pre[begin];if(w == ans[0] || w == ans[1]){return t[begin];}int i;int g = 1;int now;for(i = 0; i < n - 1; i++){if(((w >> i) & 1) != ((w >>(i + 1)) & 1)){if(((w >> i) & 1) == 1){now = w + g;}else{now = w - g;}if(vis[now] == 0){vis[now] = 1;pre[end] = now;t[end++] = t[begin] + 1;}}g *= 2;}begin++;}
}
int main()
{while(scanf("%d %d",&n,&m)!=EOF){int i,j;st = 0;for(i = 0; i < n; i++){scanf("%d",&a[i]);}int g = 1;for(i = n - 1; i >= 0; i--){st += a[i] * g;g *= 2;}for(i = 0; i < m; i++){scanf("%d",&b[i]);}g = 0;j = 0;for(i = 0; i < m; i++){for(int k = 0; k < b[i]; k++){c[j++] = g;}g ^= 1;}ans[0] = ans[1] = 0;g = 1;for(i = n - 1; i >= 0; i--){ans[0] += c[i] * g;g *= 2;}g = 1;j = 0;for(i = 0; i < m; i++){for(int k = 0; k < b[i]; k++){c[j++] = g;}g ^= 1;}g = 1;for(i = n - 1; i >= 0; i--){ans[1] += c[i] * g;g *= 2;} memset(vis,0,sizeof(vis));printf("%d\n",bfs());}return 0;
}
转载于:https://www.cnblogs.com/sola1994/p/4369259.html
csu 1536 Bit String Reordering(模拟 bfs+状态压缩)相关推荐
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- BFS + 状态压缩总结
BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...
- nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】
题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...
- hdu 1429 胜利大逃亡(续) bfs+状态压缩
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- poj 1324(BFS+状态压缩)
解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个 值来表示相对位置.最开始想如何用四进制来表示它,无语.....还是题目做少了,直接用 ...
- 2021-08-06 leetcode每日一题 BFS+状态压缩,无向图的
访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号. 给你一个数组 graph 表示这个图.其中,graph[i] 是一个列表,由所有与节点 i ...
- bfs+状态压缩dp
题意: 给你一个地图,问你吧所有的隧道都走完的最小费用,起点不固定,穿越隧道的时间不计,在隧道外边每移动一步花费一秒. 思路: 先bfs求出所有dis[i][j](i的终点和j ...
- nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)
题目999 题目信息 执行结果 本题排行 讨论区 师傅又被妖怪抓走了 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝 ...
- 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)
题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...
最新文章
- C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
- android:使用Messenger进行进程间通信(一)
- python3 自动化交互模块 pexpect 简介
- idea 整合SSM(spring spring-mvc mybatis)
- sass学习记录及vue实践
- 智稳双全--AnalyticDB如何助力菜鸟运配双十一
- django下创建APP
- Python-循环控制--个人课堂笔记
- redis zset转set 反序列化失败_关于Redis中的五种数据结构,要知其然知其所以然...
- 交换技术及其具体应用
- HDU2007 平方和与立方和【序列处理+入门】
- 132.Function Handing 函数
- Android移动开发基础案例教程 第3章 Activity
- python自动生成采集规则_python 织梦自动采集更新脚本
- 灵棋排盘(七政四余)入门指导—排盘与框架
- 计算机图形学入门(十二)-阴影映射Shadow mapping(为光线追踪准备)
- 一秒知道光纤、光缆、跳线、尾纤、连接器类型
- 网络编程之端口:端口号为什么常见是8000、8080、8888...
- ThinkPHP5.0+PHPMailer 实现qq邮箱验证码
- mysql 不识别欧元符号_将欧元和美元符号插入MySQL中的列?
热门文章
- 中国高校计算机考研:计算机数据结构核心考点解析
- java 没有提示信息,ActionErrors没有提示信息
- Linux调试分析诊断利器----strace
- React学习:入门实例-学习笔记
- 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】
- Jupyter 绘图怎么显示中文
- Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors
- Tensorflow 入门教程
- Java的HTTP服务端响应式编程
- 2017年秋招二十套前端面试题分享