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+状态压缩)相关推荐

  1. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  2. BFS + 状态压缩总结

    BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...

  3. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  4. hdu 1429 胜利大逃亡(续) bfs+状态压缩

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. poj 1324(BFS+状态压缩)

    解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个 值来表示相对位置.最开始想如何用四进制来表示它,无语.....还是题目做少了,直接用 ...

  6. 2021-08-06 leetcode每日一题 BFS+状态压缩,无向图的

    访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号. 给你一个数组 graph 表示这个图.其中,graph[i] 是一个列表,由所有与节点 i ...

  7. bfs+状态压缩dp

    题意:       给你一个地图,问你吧所有的隧道都走完的最小费用,起点不固定,穿越隧道的时间不计,在隧道外边每移动一步花费一秒. 思路:       先bfs求出所有dis[i][j](i的终点和j ...

  8. nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)

    题目999 题目信息 执行结果 本题排行 讨论区 师傅又被妖怪抓走了 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝 ...

  9. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)

    题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...

最新文章

  1. C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
  2. android:使用Messenger进行进程间通信(一)
  3. python3 自动化交互模块 pexpect 简介
  4. idea 整合SSM(spring spring-mvc mybatis)
  5. sass学习记录及vue实践
  6. 智稳双全--AnalyticDB如何助力菜鸟运配双十一
  7. django下创建APP
  8. Python-循环控制--个人课堂笔记
  9. redis zset转set 反序列化失败_关于Redis中的五种数据结构,要知其然知其所以然...
  10. 交换技术及其具体应用
  11. HDU2007 平方和与立方和【序列处理+入门】
  12. 132.Function Handing 函数
  13. Android移动开发基础案例教程 第3章 Activity
  14. python自动生成采集规则_python 织梦自动采集更新脚本
  15. 灵棋排盘(七政四余)入门指导—排盘与框架
  16. 计算机图形学入门(十二)-阴影映射Shadow mapping(为光线追踪准备)
  17. 一秒知道光纤、光缆、跳线、尾纤、连接器类型
  18. 网络编程之端口:端口号为什么常见是8000、8080、8888...
  19. ThinkPHP5.0+PHPMailer 实现qq邮箱验证码
  20. mysql 不识别欧元符号_将欧元和美元符号插入MySQL中的列?

热门文章

  1. 中国高校计算机考研:计算机数据结构核心考点解析
  2. java 没有提示信息,ActionErrors没有提示信息
  3. Linux调试分析诊断利器----strace
  4. React学习:入门实例-学习笔记
  5. 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】
  6. Jupyter 绘图怎么显示中文
  7. Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors
  8. Tensorflow 入门教程
  9. Java的HTTP服务端响应式编程
  10. 2017年秋招二十套前端面试题分享