HDU 1430 魔板 (BFS)
来源:互联网 发布:如何手机网络定位找人 编辑:程序博客网 时间:2024/05/24 16:13
题目: LINK
给定一个1~8的序列,有三种变换,最少经过多少次变换得到目的序列。若最少的变换有多种取字典序最小的。
其实,是很裸的bfs,但是对于每次输入都BFS会TLE.
会发现无论输入什么,起始状态都可以转化看做同一种状态的,只是数字的编号不同而已。
因而可以作一个映射,使得起始状态都一样,而只把这个统一的起始状态BFS一次,搜索到所有的结果8!。
之后的每次输入数据,映射后,都成了一次询问了。
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<cmath>#include<queue>#include<map>#include<set>using namespace std;#define INF 1000000000#define N 100111struct node{ string num,ans ; int len;};map<string, int> vis;map<string, string> vv;map<char , char > mm;node S, T;string change(string x, int id){ string ret = ""; if(id == 0) { for(int i = 7; i>=0; i--) ret += x[i]; return ret; } if(id == 1) { ret += x[3]; ret += x[0]; ret += x[1]; ret += x[2]; ret += x[5]; ret += x[6]; ret += x[7]; ret += x[4]; return ret; } if(id == 2) { ret += x[0]; ret += x[6]; ret += x[1]; ret += x[3]; ret += x[4]; ret += x[2]; ret += x[5]; ret += x[7]; return ret; }}void bfs(){ queue<node > Q; S.len= 0; S.ans = ""; node now, next; Q.push(S); vis[S.num] = 0; vv[S.num] = S.ans; while(!Q.empty()) { now = Q.front(); Q.pop(); for(int i = 0; i<=2; i++) { next = now; next.len ++; next.ans += ('A' + i); next.num = change(now.num, i); if(vis[next.num] == 0) vis[next.num] = INF; if(vis[next.num] <next.len) continue; if(vis[next.num] > next.len) { vis[next.num] = next.len; vv[next.num] = next.ans; Q.push(next); } else if(vis[next.num] == next.len ) { if(vv[next.num] > next.ans) { vv[next.num] = next.ans; Q.push(next); } } } }}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif // ONLINE_JUDGE S.num = "12345678"; bfs(); while(cin>>S.num>>T.num ) { if(S.num == T.num) { printf("\n"); continue; } mm.clear(); for(int i = 0; i<8; i++) mm[S.num[i]] = '1'+i; for(int i = 0; i<8; i++) T.num[i] = mm[T.num[i]]; cout<<vv[T.num]<<endl; }return 0;}
0 0
- HDU 1430 魔板 (BFS)
- hdu 1430 魔板 (预处理+置换+bfs)
- HDU 1430 魔板(BFS+HASH+置换)
- HDU - 1430 魔板 (bfs预处理 + 康托)
- HDU 1430+BFS
- HDU 1430 魔板 (双向BFS)/(BFS预处理)+map判重
- hdu 1430 魔板(bfs+康拓展开)
- hdu 1430 魔板(bfs+预处理+康托展开)
- hdu 1430 魔板(康托展开+BFS+巧妙转换)
- HDU 1430 魔板 [BFS+康拓展开]【数学】
- HDU 1430 魔板 康托展开或字典树 + BFS
- HDU bfs
- hdu 1175 bfs
- HDU 1072(BFS)
- HDU 1429(BFS )
- hdu 1026(BFS)
- HDU 4039 BFS
- hdu 1312 bfs
- cin cout
- 九度oj 题目1009:二叉搜索树
- 子衿的事(84)
- 思考
- NYOJ-欧几里得
- HDU 1430 魔板 (BFS)
- DOS命令字典..收藏
- 自己写的一个入栈程序
- Android自定义ListView或GridView适配器Adapter的getView方法不执行的问题
- Dancing Links题集
- Android 之 远程图片获取和本地缓存
- 关于IOS的屏幕适配
- JavaScript-创建第一个自己的类库
- Jmock 基本用法