`
xuela_net
  • 浏览: 493646 次
文章分类
社区版块
存档分类
最新评论

hdu 1195 Open the Lock

阅读更多

挺好的一道题目,双向bfs的题目,也能单向bfs写。不过双向写的代码太恶心了......还是因为不熟悉

题目大意:给出原密码和准确密码,对于原密码每次可以进行三个操作:
1:任意一位+1 且9+1=1
2:任意一位-1 且1-1=9
3:相邻两位互换,且首位和末位不是相邻的。
(密码只有四位数,每个数字1-9) 题目要求原密码变成准确密码的最少步数

单向bfs:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 1050
#define INF 0x7FFFFFFF
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std;

struct node
{
    int num[4];
    int step;
}first,last;

bool vis[11][11][11][11];

bool ok(node t)
{
    int cnt = 0;
    for(int i=0; i<4; i++)
    {
        if(t.num[i] == last.num[i])
            cnt++;
    }
    if(cnt == 4)
        return 1;
    return 0;
}

void bfs()
{
    queue<node> q;

    vis[first.num[0]][first.num[1]][first.num[2]][first.num[3]] = 1;
    first.step = 0;
    q.push(first);
    while(!q.empty())
    {
        node tt = q.front();
        q.pop();
        node t;
        if(ok(tt))
        {
            cout << tt.step << endl;
            return ;
        }

        for(int i=0; i<4; i++)
        {
            t = tt;
            if(t.num[i] == 9)
                t.num[i] = 1;
            else
                t.num[i] ++;
            t.step = tt.step + 1;
            if(!vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]])
            {
                q.push(t);

                vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = 1;
            }
        }
        for(int i=0; i<4; i++)
        {
            t = tt;
            if(t.num[i] == 1)
                t.num[i] = 9;
            else
                t.num[i] --;
            t.step = tt.step + 1;
            if(!vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]])
            {
                q.push(t);

                vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = 1;
            }
        }
        for(int i=0; i<3; i++)
        {
            t = tt;
            swap(t.num[i],t.num[i+1]);
            t.step = tt.step + 1;
            if(!vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]])
            {
                q.push(t);

                vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = 1;
            }
        }
    }
}

int main()
{
    int t;
    char s[10],e[10];
    cin >> t;
    while(t--)
    {
        cin >> s >> e;
        for(int i=0; i<4; i++)
            first.num[i] = s[i] - '0';
        for(int i=0; i<4; i++)
            last.num[i] = e[i] - '0';
        memset(vis,0,sizeof(vis));
        bfs();
    }
    return 0;
}


双向bfs:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std;

struct node
{
    int num[4];
    int step;
} first,last;

int vis[11][11][11][11];
int vis2[11][11][11][11];

bool ok1(node a)
{
    if(vis[a.num[0]][a.num[1]][a.num[2]][a.num[3]] != -1)
        return 1;
    return 0;
}
bool ok2(node a)
{
    if(vis2[a.num[0]][a.num[1]][a.num[2]][a.num[3]] != -1)
        return 1;
    return 0;
}


void bfs()
{
    queue<node>q,q2;
    memset(vis,-1,sizeof(vis));
    memset(vis2,-1,sizeof(vis));

    int tmp1=0,tmp2=0;
    node t,tt;
    vis[first.num[0]][first.num[1]][first.num[2]][first.num[3]] = 0;
    first.step = 0;
    q.push(first);
    vis2[last.num[0]][last.num[1]][last.num[2]][last.num[3]] = 0;
    last.step = 0;
    q2.push(last);
    while(1)
    {
        while(!q.empty() && q.front().step == tmp1)
        {
            tt = q.front();
            q.pop();

            if(ok2(tt))
            {
                int k = vis2[tt.num[0]][tt.num[1]][tt.num[2]][tt.num[3]];
                cout << tt.step + k<< endl;
                return ;
            }

            for(int i=0; i<4; i++)
            {
                t = tt;
                if(t.num[i] == 9)
                    t.num[i] = 1;
                else
                    t.num[i] ++;
                t.step = tt.step + 1;
                if(ok2(t))
                {
                    int k = vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]];
                    cout << t.step + k<< endl;
                    return ;
                }
                if(!ok1(t))
                {
                    q.push(t);
                    vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;
                }
            }
            for(int i=0; i<4; i++)
            {
                t = tt;
                if(t.num[i] == 1)
                    t.num[i] = 9;
                else
                    t.num[i] --;
                t.step = tt.step + 1;
                if(ok2(t))
                {
                    int k = vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]];
                    cout << t.step + k<< endl;
                    return ;
                }
                if(!ok1(t))
                {
                    q.push(t);
                    vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;
                }
            }
            for(int i=0; i<3; i++)
            {
                t = tt;
                swap(t.num[i],t.num[i+1]);
                t.step = tt.step + 1;
                if(ok2(t))
                {
                    int k = vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]];
                    cout << t.step + k<< endl;
                    return ;
                }
                if(!ok1(t))
                {
                    q.push(t);
                    vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;
                }
            }
        }
        tmp1 = q.front().step;
        //cout << "tmp1" <<' ' << tmp1 << endl;
        while(!q2.empty() && q2.front().step == tmp2)
        {
            tt = q2.front();
            q2.pop();
            if(ok1(tt))
            {
                int k = vis[tt.num[0]][tt.num[1]][tt.num[2]][tt.num[3]];
                cout << tt.step + k<< endl;
                return ;
            }

            for(int i=0; i<4; i++)
            {
                t = tt;
                if(t.num[i] == 9)
                    t.num[i] = 1;
                else
                    t.num[i] ++;
                t.step = tt.step + 1;
                if(ok1(t))
                {
                    int k = vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]];
                    cout << t.step + k<< endl;
                    return ;
                }
                if(!ok2(t))
                {
                    q2.push(t);
                    vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;
                }
            }
            for(int i=0; i<4; i++)
            {
                t = tt;
                if(t.num[i] == 1)
                    t.num[i] = 9;
                else
                    t.num[i] --;
                t.step = tt.step + 1;
                if(ok1(t))
                {
                    int k = vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]];
                    cout << t.step + k<< endl;
                    return ;
                }
                if(!ok2(t))
                {
                    q2.push(t);
                    vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;
                }
            }
            for(int i=0; i<3; i++)
            {
                t = tt;
                swap(t.num[i],t.num[i+1]);
                t.step = tt.step + 1;
                if(ok1(t))
                {
                    int k = vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]];
                    cout << t.step + k<< endl;
                    return ;
                }
                if(!ok2(t))
                {
                    q2.push(t);
                    vis2[t.num[0]][t.num[1]][t.num[2]][t.num[3]] = t.step;
                }
            }
        }
        tmp2 = q2.front().step;
    }

}

int main()
{
    int t;
    char s[10],e[10];
    cin >> t;
    while(t--)
    {
        cin >> s >> e;
        for(int i=0; i<4; i++)
            first.num[i] = s[i] - '0';
        for(int i=0; i<4; i++)
            last.num[i] = e[i] - '0';
        bfs();
    }
    return 0;
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics