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;
}
时间: 2024-10-12 22:50:19

hdu 5012 bfs --- 慎用STL 比如MAP判重的相关文章

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

题目 参考了     1     2 #define _CRT_SECURE_NO_WARNINGS //用的是STL中的map 和 multiset 来做的,代码写起来比较简洁,也比较好容易理解. //multiset可以允许重复 //multiset<int>::iterator it; 用来遍历 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream&g

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

Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 process()  初始化vis数组,初始化初始节点到目标节点的移动距离 dfs()搜索到每一个节点,如果不是目标节点,对其依次扩展所有子节点,并判重,全部子节点搜索完全后,改变父节点:如果是目标节点成功返回 输出最少移动步数 input: 2 6 4 1 3 7 0 5 8 8 1 5 7 3 6

hdu 1430 (BFS 康托展开 或 map )

第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个wa算了. 然后卡着了,后来上网上搜了,要用康托展开,康托展开是什么鬼?然后学习了一下,就是个映射,感觉和map差不多. http://blog.csdn.net/zhongkeli/article/details/6966805这个学习一下康托展开. 其实本题的关键不是康托展开,而是置换. 以12

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

http://acm.hdu.edu.cn/showproblem.php?pid=4821 昨晚卡了非常久,開始TLE,然后优化了之后,由于几个地方变量写混.一直狂WA.搞得我昨晚都失眠了,,. 这几次hash军写错的变量--tmp=(j==m-1)?ah[j]:(ah[j]-ah[j-m]*base[m]);  外层循环变量是i,我写的字符串hash的几题都写成tmp=(i==0)? ah[j]:(ah[j]-ah[j-m]*base[m]); 二逼啊 题目大意: 给定一个字符串(最长10^

hdu 5199 Gunner(STL之map,水)

Problem Description Long long ago, there is a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are n birds and n trees. The i−thbird stands on the top of the i−th tree. The trees stand in straight line fr

HDU 5012 bfs暴搜

Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 243    Accepted Submission(s): 135 Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number wa

hdu 5012 bfs 康托展开

Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 491    Accepted Submission(s): 290 Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number w

HDU 5012 BFS水

2014 ACM/ICPC Asia Regional Xi'an Online 对于一个筛子,规定了以底面的四个边为轴,可以进行翻转,给出起始状态,求最少步骤到目标状态. 简单BFS #include "stdio.h" #include "string.h" #include "math.h" #include "queue" using namespace std; struct node { int s[7]; int

51nod 1024 矩阵中不重复的元素(质因数分解+map判重)

1024 矩阵中不重复的元素 题目来源: Project Euler 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 一个m*n的矩阵. 该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b 第二列是a^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1) ....... 第m列是a^(b + m - 1),(a+1)^(b + m - 1),.....(a + n - 1)^(b +