HihoCoder 1251 BFS预处理
来源:互联网 发布:西安交大远程网络教育 编辑:程序博客网 时间:2024/05/20 09:24
题意
给一堆字符串,问转换成另一种字符串,最少需要多少步。存在两种操作,第一种操作是讲一个数字转换为另一个数字,第二种操作是将一种数字转换为另一种数字。
题解
首先说明一下,这道题Uvalive是过不了的,只有Hihocoder能过。
这道题暴力BFS肯定是超时的。但是由于数字只有六种,我们可以考虑对数字种类转换进行BFS预处理。记录从123456-》123456到其他数字映射的最小步数,需要注意的是,如果我们把1映射为2,那么再次将2映射成4的时候,会有两个位置映射成4。这一点需要在BFS的时候考虑一下。
预处理完以后,针对每个字符串,去考虑一下在每个状态下,最少需要多少次单个数字的转换操作才能将这个字符串转换为目标字符串。最后输出最小值就可以了。
代码
#include<bits/stdc++.h>#define LL long long#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)#define W(t) while(t)#define MEM(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MAXN 700010#define MOD 1000000007using namespace std;char s1[120],s2[120];int i1[120],i2[120];int len;int ans;int step[MAXN],vis[MAXN];vector<int> vc;void charToInt(int *in,char *ch) { int len=strlen(ch); UP(i,0,len) { in[i]=ch[i]-'0'; }}int encode(int* x){ int sum=0; UP(i,0,6){ sum=sum*10+x[i]; } return sum;}void decode(int* x,int sum){ DOWN(i,6,0){ x[i]=sum%10; sum/=10; }}void bfs() { MEM(vis,false); queue<int> q; int first=123456; step[first]=0; q.push(first); W(!q.empty()) { int nd=q.front(); q.pop(); if(vis[nd]) continue;// cout<<nd<<endl; vis[nd]=true; int x[10],tmp[10]; decode(x,nd); UP(i,1,7){ UP(j,1,7){ if(i==j) continue; memcpy(tmp,x,sizeof(x)); UP(s,0,6) if(tmp[s]==i) tmp[s]=j; int tp=encode(tmp); step[tp]=min(step[tp],step[nd]+1); if(!vis[tp]) q.push(tp); } } }}int main() {// freopen("d://in.txt","r",stdin);// freopen("d://o1.txt","w",stdout); vc.clear(); MEM(step,INF); bfs(); UP(i,0,MAXN){ if(step[i]<INF) vc.push_back(i); } W(~scanf("%s%s",s1,s2)) { ans=INF; len=strlen(s1); charToInt(i1,s1); charToInt(i2,s2); for(int i:vc){ int sum=step[i]; if(sum>=INF) continue; int x[10]; decode(x,i); UP(j,0,len){ if(x[i2[j]-1]!=i1[j]) sum++; } if(sum<ans){ ans=min(ans,sum);// cout<<step[i]<<" "<<i<<" "<<sum<<endl; } } printf("%d\n",ans); }}
阅读全文
0 0
- HihoCoder 1251 BFS预处理
- hihocoder Boxes 状压八进制bfs 加预处理
- HihoCoder 1233 Boxes BFS
- poj_3669_Meteor Shower(BFS+预处理)
- HDU 3567 BFS+预处理
- hdu5637 Transform (bfs+预处理)
- poj 3669 bfs+预处理
- BFS+预处理 POJ
- Travel (BFS + 预处理优化)
- hihoCoder 1233 Boxes(bfs)
- uva 11624 Fire!(bfs预处理)
- 【NOIP2013】华容道 SPFA+BFS预处理
- HDU 3533 Escape 预处理+bfs
- 计蒜客 逃跑 (bfs+预处理)
- hihoCoder 第38周 二分答案+BFS
- HihoCoder 1233 Boxes(bfs打表)
- HihoCoder 1233 Boxes (bfs 状压)
- hihocoder #1613 : 墨水滴 bfs+优先队列
- EMD经验模态分解——分析时间序列
- 给定有向图,每条边只能用一次,求给定两点间有几条最短路。
- apache文件上传组件
- K:注解语法简介
- 深入理解JVM(一)-JVM内存模型
- HihoCoder 1251 BFS预处理
- 深入理解JVM(二)-类加载机制
- Ubuntu14.04编译TradeFederation
- make pycaffe遇到致命错误No such file or directory Python.h
- 跟hashmap有关的算法题
- 【BZOJ2729】【HNOI2012】排队(组合数学)
- git基础指令
- HDU 5556 Land of Farms(枚举+二分图匹配)
- leetcode---combination-sum---dfs