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的判重等等....哎  二笔了  太暴力了

#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判重的更多相关文章

  1. POJ3087 Shuffle'm Up —— 打表找规律 / map判重

    题目链接:http://poj.org/problem?id=3087 Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  2. 逆向bfs搜索打表+康拓判重

    HDU 1043八数码问题 八数码,就是1~8加上一个空格的九宫格,这道题以及这个游戏的目标就是把九宫格还原到从左到右从上到下是1~8然后最后是空格. 没了解康托展开之前,这道题怎么想都觉得很棘手,直 ...

  3. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  4. hdu 1430 (BFS 康托展开 或 map )

    第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...

  5. HDU 4022 Bombing(stl,map,multiset,iterater遍历)

    题目 参考了     1     2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. ...

  6. hdu 4821 字符串hash+map判重 String (长春市赛区I题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...

  7. hdu 5199 Gunner(STL之map,水)

    Problem Description Long long ago, there is a gunner whose name is Jack. He likes to go hunting very ...

  8. hdu 5012 bfs 康托展开

    Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  9. (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅

    字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...

随机推荐

  1. 如何用cookie保存用户的登录的密码和用户名

    思路:绘制一个简单的登录界面的Servlet并要在此页面中读取保存密码和用户名的cookie--->在登录处理界面的servlet中把用户名和密码保存到cookie中 //登录界面的Servle ...

  2. 转:mysql grant

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...

  3. 【CF1020D】The hat(交互,二分)

    题意:有n个人围成一个圈,n为偶数,每个人有一个数字a[i],保证相邻两个人的数字差为1 最多可以询问60次,要求获得一个i使得a[i]=a[i+n/2] n<=1e5,abs(a[i])< ...

  4. Spring 的IOC 和Aop

    Spring 的IOC 和Aop

  5. 发布windows服务的批处理

    安装bat: C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe WatchWinService.exe pause 卸载bat ...

  6. Linux内核情景分析之异常访问,用户堆栈的扩展

    情景假设: 在堆内存中申请了一块内存,然后释放掉该内存,然后再去访问这块内存.也就是所说的野指针访问. 当cpu产生页面错误时,会把失败的线性地址放在cr2寄存器.线性地址缺页异常的4种情况 1.如果 ...

  7. (十)Linux查看系统信息的一些命令及查看已安装软件包的命令

    转自:http://cheneyph.iteye.com/blog/824746 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看 ...

  8. python3使用urllib获取set-cookies

    #!/usr/bin/env python # encoding: utf-8 import urllib.request from collections import defaultdict re ...

  9. entitymanager 进行数据序列化

    场景:同一个方法里,需要将前一部分执行的数据保存到数据库.后半部分读取数据时从数据库里获取,而不是获取到缓存里的数据. 理解eneityManager的这三个方法的作用和区别,首先需要分清楚Persi ...

  10. 【原创】Talend ETL Job日志框架——基于P&G项目的一些思考和优化

    一.背景 接触talend也挺长一段时间了,在P&G项目中每天都是使用它开发job,做ETL,也看了前辈开发的很多ETL Job,学到不少.也接触了TAC(talend administrat ...