您的位置:首页 > 理论基础 > 计算机网络

HDU 5012 Dice (2014年西安赛区网络赛F题)

2015-09-12 22:59 531 查看
1.题目描述:点击打开链接

2.解题思路:本题利用BFS解决。本题是一道隐式图搜索题目,不过本题的状态扩展比较简单,直接用常量数组即可搞定,然后就可以进行扩展了,比较简单就不再详细叙述过程了。

3.代码:

#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<complex>
#include<functional>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define me(s)  memset(s,0,sizeof(s))
#define rep(i,n) for(int i=0;i<(n);i++)
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair <int, int> P;

typedef int State[6];
const int N=6000000;
const int Hashsize=10007;

State st
;
State goal;
int dist
;

int head[Hashsize],Next
;
int op[][6]={{3,2,0,1,4,5},{4,5,2,3,1,0},{2,3,1,0,4,5},{5,4,2,3,0,1}};

int Hash(State&s)
{
    int v=0;
    for(int i=0;i<6;i++)
        v=v*6+s[i];
    return v%Hashsize;
}

void init_lookup_table()
{
    memset(head,0,sizeof(head));
}
int try_to_insert(int s)
{
    int h=Hash(st[s]);
    int u=head[h];
    while(u)
    {
        if(memcmp(st[u],st[s],sizeof(st[s]))==0)return 0;
        u=Next[u];
    }
    Next[s]=head[h];
    head[h]=s;
    return 1;
}

int bfs()
{
    init_lookup_table();
    int front=1,rear=2;
    while(front<rear)
    {
        State&s=st[front];
        if(memcmp(goal,s,sizeof(s))==0)return front;
        for(int i=0;i<4;i++)
        {
            State&t=st[rear];
            for(int j=0;j<6;j++)
                t[j]=s[op[i][j]];
            dist[rear]=dist[front]+1;
            if(try_to_insert(rear))rear++;
        }
        front++;
    }
    return 0;
}

bool judge()
{
    for(int i=0;i<6;i++)
        if(st[1][i]!=goal[i])return false;
    return true;
}

int main()
{
    while(~scanf("%d",&st[1][0]))
    {
        for(int i=1;i<6;i++)
        scanf("%d",&st[1][i]);
        for(int i=0;i<6;i++)
            scanf("%d",&goal[i]);
        for(int i=0;i<6;i++)
            st[1][i]--,goal[i]--;
        int ans;
        if(judge()){printf("0\n");continue;}
        else ans=bfs();
        if(ans)printf("%d\n",dist[ans]);
        else puts("-1");
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: