hihoCoder 1233 Boxes(状态压缩)
来源:互联网 发布:日本外汇储备数据 编辑:程序博客网 时间:2024/06/05 11:38
题目链接:
http://hihocoder.com/problemset/problem/1233
解题思路:
题目大意:
有n个卡槽,放有体积不同的n个空盒子,每次你可以移动一个空盒子到相邻卡槽,但前提是相邻卡槽若已经有空盒子,那么要移动
的空盒子体积必须小于已有的空盒子,问要移动多少步才能使得从左到右,每个卡槽空盒子的体积递增。
解题思路:
说实话,不得不佩服网上的一些大牛们,自己以前学的状态压缩这是渣渣,
http://blog.csdn.net/u014664226/article/details/48615393看了他的博客后,我才知道,状态压缩说
的很简单,把状态压缩,但是实际操作起来,脑洞真是要够大的呀。。。他是说的:用每个盘子所在的位置表示状态,每个盘子的
位置用三位二进制表示,总共的状态为2^21,因为每次盘子只能向左放或者向右放,那么我们从结束的位置开始搜索,bfs预处理出
目标状态到所有状态所需要的最小步数,然后对于每个询问O(1)回答即可。
AC代码:
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int maxn = 5000000;int n;int a[10],b[10];int vis[maxn];bool tmp[10];void bfs(int n){ queue<int> q; int cur = 0; for(int i = 0; i < n; i++) cur += (i+1) * (1 << (3*i)); q.push(cur); vis[cur] = 0; while(!q.empty()){ cur = q.front(); q.pop(); memset(tmp,0,sizeof(tmp)); for(int i = 0; i < n; i++){//i+1在哪个位置 int pos = (cur >> (3*i)) % 8; if(tmp[pos]) continue; tmp[pos] = 1; if(pos>1 && !tmp[pos-1]){ int t = cur - (1<<(3*i)); if(vis[t] == -1){ q.push(t); vis[t] = vis[cur] + 1; } } if(pos<n && !tmp[pos+1]){ int t = cur + (1<<(3*i)); if(vis[t] == -1){ q.push(t); vis[t] = vis[cur] + 1; } } } }}int main(){ int T; scanf("%d",&T); memset(vis,-1,sizeof(vis)); for(int i = 1; i <= 7; i++) bfs(i); while(T--){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d",&a[i]); b[i] = a[i]; } sort(b+1, b+n+1); for(int i = 1; i <= n; i++) a[i] = lower_bound(b+1,b+n+1,a[i]) - b - 1; int s = 0; for(int i = 1; i <= n; i++) s += i*(1<<(3*a[i])); printf("%d\n",vis[s]); } return 0;}
0 0
- hihoCoder 1233 Boxes(状态压缩)
- hihocoder 1233 Boxes(bfs+状态压缩+hash表)
- hihocoder #1233 : Boxes 北京赛区(2015)网络赛(状态压缩+bfs)
- hihoCoder 1233 Boxes(bfs)
- hihoCoder 1233 Boxes(状态压缩 + bfs)——ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛
- hiho 1233 Boxes(状态压缩+BFS)
- HihoCoder 1233 Boxes(bfs打表)
- HihoCoder 1233 Boxes (bfs 状压)
- hihocoder 1233 Boxes
- hihocoder 1233Boxes
- hihoCoder 1233 Boxes
- HihoCoder 1233 Boxes BFS
- hihocoder#1044之状态压缩(一)
- hihocoder 状态压缩二
- 【hihocoder】状态压缩dp
- HihoCoder 状态压缩一
- HihoCoder 状态压缩二
- hihocoder 1044 状态压缩·一 (状态dp)
- HDU 5195 DZY Loves Topological Sorting(优先队列)
- UVA - 10340 All in All
- 二叉树镜像--20150924
- Java类加载机制源码分析
- Python 学习(7)---网页访问异常处理
- hihoCoder 1233 Boxes(状态压缩)
- D-SIFT
- 详解pkg-config --cflags --libs glib-2.0的作用
- Linux中,getrlimit(),setrlimit(),getrusage()
- 一个长度为N的数组中包含正数 负数 0,请实现一个函数找出和为0的最长子数列
- centos6.7更换yum源
- 【ACM】HDOJ 1009 FatMouse' Trade
- 贝叶斯网络
- iOS项目开发实战——UIImageView的使用与图片显示模式