hdu 5012 bfs --- 慎用STL 比如MAP判重
2014-10-05 00:40
337 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5012
发现一个问题 如果Sting s = '1'+'2'+'3';
s!="123"!!!!!! 而是有乱码
先贴一份自己的TLE 代码,
超时应该是因为:
1、cin
2、map判重 map find太花时间
3、string花时间
4、其实不用两个都旋转,只要旋转一个就行,这样可以省下很多时间 包括少用了make_pair pair的判重等等....哎 二笔了 太暴力了
看了别人的代码 因为这道题的技术含量不怎么高 懒得再写了,贴别人的把
用数组代替状态,至于判重 因为只有六位数,所以化为整数然后判重就行了 代码来自http://blog.csdn.net/u011345461/article/details/39275009
发现一个问题 如果Sting s = '1'+'2'+'3';
s!="123"!!!!!! 而是有乱码
先贴一份自己的TLE 代码,
超时应该是因为:
1、cin
2、map判重 map find太花时间
3、string花时间
4、其实不用两个都旋转,只要旋转一个就行,这样可以省下很多时间 包括少用了make_pair pair的判重等等....哎 二笔了 太暴力了
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <set> #include <queue> #include <map> using namespace std; #define IN(s) freopen(s,"r",stdin) #define CL(a,b) memset(a,b,sizeof(a)) map< pair<string ,string>, int>mp; string left(string x) { string tmp; tmp+=x[3]; tmp+=x[2]; tmp+=x[0]; tmp+=x[1]; tmp+=x[4]; tmp+=x[5]; //cout << "st" << tmp << endl; //x=tmp; return tmp; } string right(string x) { string tmp; //tmp=x[2]+x[3]+x[1]+x[0]+x[4]+x[5]; tmp+=x[2]; tmp+=x[3]; tmp+=x[1]; tmp+=x[0]; tmp+=x[4]; tmp+=x[5]; //x=tmp; return tmp; } string front(string x) { string tmp; //tmp= x[5]+x[4]+x[2]+x[3]+x[0]+x[1]; tmp+= x[5]; tmp+=x[4]; tmp+=x[2]; tmp+=x[3]; tmp+=x[0]; tmp+=x[1]; //x=tmp; return tmp; } string back(string x) { string tmp; //tmp=x[4]+x[5]+x[2]+x[3]+x[1]+x[0]; tmp+=x[4]; tmp+=x[5]; tmp+=x[2]; tmp+=x[3]; tmp+=x[1]; tmp+=x[0]; //x=tmp; return tmp; } queue< pair<string,string> >q; string a,b; int solve() { while(!q.empty())q.pop(); mp[ make_pair(a,b) ]=0; q.push( make_pair(a,b) ); int flag=0; while(!q.empty()) { pair <string,string> tp; tp.first=q.front().first; tp.second=q.front().second; if(tp.first == tp.second){flag=1; return mp[tp];} string tmp=left(tp.first); if(mp.find(make_pair(tmp,tp.second)) == mp.end()) {mp[make_pair(tmp,tp.second)]=mp[tp]+1; q.push(make_pair(tmp,tp.second)); } tmp=left(tp.second);if(mp.find(make_pair(tp.first,tmp))== mp.end()) { mp[make_pair(tp.first,tmp)]=mp[tp]+1;q.push(make_pair(tp.first,tmp)); } tmp=right(tp.first);if(mp.find(make_pair(tmp,tp.second)) == mp.end()) {mp[make_pair(tmp,tp.second)]=mp[tp]+1; q.push(make_pair(tmp,tp.second)); } tmp=right(tp.second);if(mp.find(make_pair(tp.first,tmp)) == mp.end()){ mp[make_pair(tp.first,tmp)]=mp[tp]+1;q.push(make_pair(tp.first,tmp)); } tmp=front(tp.first);if(mp.find(make_pair(tmp,tp.second)) == mp.end()) {mp[make_pair(tmp,tp.second)]=mp[tp]+1; q.push(make_pair(tmp,tp.second)); } tmp=front(tp.second);if(mp.find(make_pair(tp.first,tmp)) == mp.end()) { mp[make_pair(tp.first,tmp)]=mp[tp]+1;q.push(make_pair(tp.first,tmp)); } tmp=back(tp.first);if(mp.find(make_pair(tmp,tp.second)) == mp.end()) {mp[make_pair(tmp,tp.second)]=mp[tp]+1; q.push(make_pair(tmp,tp.second)); } tmp=back(tp.second);if(mp.find(make_pair(tp.first,tmp)) == mp.end()) { mp[make_pair(tp.first,tmp)]=mp[tp]+1;q.push(make_pair(tp.first,tmp)); } q.pop(); } if(!flag) return -1; } int main() { //IN("hdu5012.txt"); while(cin>>a) { b="";// string tmp; for(int i=0;i<5;i++) { cin>>tmp; a+=tmp; } for(int i=0;i<6;i++) { cin>>tmp; b+=tmp; } printf("%d\n",solve()); } return 0; }
看了别人的代码 因为这道题的技术含量不怎么高 懒得再写了,贴别人的把
用数组代替状态,至于判重 因为只有六位数,所以化为整数然后判重就行了 代码来自http://blog.csdn.net/u011345461/article/details/39275009
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int MAXN = 6; struct node{ node() { memset(arr, 0, sizeof(arr)); d = 0; } int arr[MAXN], d; }s, e; int vis[MAXN * 200000]; int change(node a) { int num = 0; for (int i = 0; i < MAXN; i++) { num = num * 10 + a.arr[i]; } return num; } bool judge(node a, node b) { for (int i = 0; i < MAXN; i++) if (a.arr[i] != b.arr[i]) return false; return true; } node turn(node a, int i) { node c; if (i == 1) { c.arr[0] = a.arr[3]; c.arr[1] = a.arr[2]; c.arr[2] = a.arr[0]; c.arr[3] = a.arr[1]; c.arr[4] = a.arr[4]; c.arr[5] = a.arr[5]; } if (i == 2) { c.arr[0] = a.arr[2]; c.arr[1] = a.arr[3]; c.arr[2] = a.arr[1]; c.arr[3] = a.arr[0]; c.arr[4] = a.arr[4]; c.arr[5] = a.arr[5]; } if (i == 3) { c.arr[0] = a.arr[5]; c.arr[1] = a.arr[4]; c.arr[2] = a.arr[2]; c.arr[3] = a.arr[3]; c.arr[4] = a.arr[0]; c.arr[5] = a.arr[1]; } if (i == 4) { c.arr[0] = a.arr[4]; c.arr[1] = a.arr[5]; c.arr[2] = a.arr[2]; c.arr[3] = a.arr[3]; c.arr[4] = a.arr[1]; c.arr[5] = a.arr[0]; } return c; } int bfs() { memset(vis, 0, sizeof(vis)); queue<node> q; q.push(s); node tmp; vis[change(s)] = 1; while (!q.empty()) { tmp = q.front(); q.pop(); if (judge(tmp, e)) { return tmp.d; } for (int i = 1; i <= 4; i++) { node c; c = turn(tmp, i); if (!vis[change(c)]) { c.d = tmp.d + 1; vis[change(c)] = 1; q.push(c); } } } return -1; } int main() { while (scanf("%d", &s.arr[0]) != EOF) { for (int i = 1; i < MAXN; i++) scanf("%d", &s.arr[i]); for (int i = 0; i < MAXN; i++) scanf("%d", &e.arr[i]); printf("%d\n", bfs()); } return 0; }
相关文章推荐
- hdu 5012 bfs --- 慎用STL 比方MAP判重
- HDU 1495 非常可乐(BFS & STL)
- HDU 5012 Dice (bfs)
- hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs
- 【搜索入门专题1】 hdu1242 J - Rescue c++ stl容器之优先队列+BFS
- 【非图BFS+STL】电脑修好了—Open the Lock_HDU 1195
- HDU - 5012 Dice(bfs+hash)
- hdu 5012 模拟+bfs
- HDU - 5012 Dice(BFS)
- hdu 5012 bfs 康托展开
- HDU 5012-Dice(BFS)
- hdu 5012(bfs)
- HDU 5012 Dice bfs
- hdu 5012 Dice 2014 ACM/ICPC Asia Regional Xi'an Online bfs
- HDU-#5012 Dice(BFS)
- HDU 5012 Dice (BFS)
- HDU 5012 Dice 普通bfs
- hdu 5012 模拟+bfs
- HDU 5012 Dice (BFS)
- HDU5014(异或) HDU 5012(BFS)(2014 ACM/ICPC Asia Regional Xi'an Online)题解