hdu 5012 bfs --- 慎用STL 比方MAP判重
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判重的更多相关文章
- POJ3087 Shuffle'm Up —— 打表找规律 / map判重
题目链接:http://poj.org/problem?id=3087 Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 逆向bfs搜索打表+康拓判重
HDU 1043八数码问题 八数码,就是1~8加上一个空格的九宫格,这道题以及这个游戏的目标就是把九宫格还原到从左到右从上到下是1~8然后最后是空格. 没了解康托展开之前,这道题怎么想都觉得很棘手,直 ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- hdu 1430 (BFS 康托展开 或 map )
第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...
- HDU 4022 Bombing(stl,map,multiset,iterater遍历)
题目 参考了 1 2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. ...
- hdu 4821 字符串hash+map判重 String (长春市赛区I题)
http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这 ...
- hdu 5199 Gunner(STL之map,水)
Problem Description Long long ago, there is a gunner whose name is Jack. He likes to go hunting very ...
- hdu 5012 bfs 康托展开
Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅
字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...
随机推荐
- 用CSS模拟魔兽世界技能冷却的效果
效果演示 上面的效果看起来还不错吧.在网页里,除了用Flash,我们还是有不少方法可以实现它. 显然这种效果不复杂,一张背景图片,加上前面带有透明度的多边形图层,在脚本控制下就可以转起来了.但问题 ...
- vs2008升级正式版
1.VS2008简体中文正式版序列号 1.Visual Studio 2008 Professional Edition: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT 2.Visual ...
- JS实现 java的Map
Map = function () { this.objects = new Object(); // 加入元素 this.put = function (key, value) { this.obj ...
- clips 前端 js 动画 抛物线加入购物车
抛物线加入购物车的特效动画(支持ie7以上,移动端表现良好) 1.引用一个极小的jquery插件库 2.启动 设置 起点 终点 和完成后回调函数 1.插件地址 git-hub上的官方主页 ...
- 笔记软件:三强篇EverNote、Mybase、Surfulater
通过上一篇<寻找最好的笔记软件:海选篇>的综合分析,作者发现有3种软件具有较明显的优势,可谓“笔记软件三强”.它们是:EverNote.Mybase 和 Surfulater.此三者相同之 ...
- 创建型设计模式之单例模式(Singleton)
结构 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更 ...
- 第18章 Active控件
转自: https://blog.csdn.net/u014162133/article/details/46573873 容器和服务器程序 容器应用程序时可以嵌入或链接对象的应用程序.Word就是容 ...
- POCO库中文编程参考指南(4)Poco::Net::IPAddress
POCO库中文编程参考指南(4)Poco::Net::IPAddress 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmai ...
- c/c++类型转换相关总结
在c语言中存在两种类型转换:显式类型转换和隐式类型转换: 显示类型转换:在类型前加上(type)变量,对变量进行的转换,程序员自己显式添加: char *ptra = (char*)ptrb; voi ...
- Java定义bean实体类中的变量时变量名的问题
首先:TMD,这个问题花了我两个多小时,居然是因为一个字母的大小写导致的,我瞬间就&Y^%^&%&()*%¥%¥¥&^#@%&; 事情是酱紫的: 我定义了一个变 ...