码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1067 Gap BFS+Hash

时间:2014-09-01 22:36:53      阅读:334      评论:0      收藏:0      [点我收藏+]

标签:blog   os   io   ar   for   数据   div   cti   log   

感觉可以用bfs暴力,一开始写了一个很暴力的bfs,hash判重,本地跑了几组数据发现至少要2s才能过,交上去估计要TLE,试探性的交了一发1A了,原来时限是10s,我看成1s了,真是逗逼。。。还一直不敢写

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <queue>
#include <deque>
#include <bitset>
#include <list>
#include <cstdlib>
#include <climits>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <stack>
#include <sstream>
#include <numeric>
#include <fstream>
#include <functional>

using namespace std;

#define MP make_pair
#define PB push_back
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef pair<int,int> pii;
const int INF = INT_MAX / 3;
const double eps = 1e-8;
const LL LINF = 1e17;
const double DINF = 1e60;
const int maxn = 5, maxm = 9;
const int n = 4,m = 8;
const int maxq = 65536;
int mp[maxn][maxm];

struct Node {
    int data[maxn][maxm],dis;
    Node(int val[maxn][maxm],int dis):dis(dis) {
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= m;j++) {
                data[i][j] = val[i][j];
            }
        }
    }

    Node() {
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j < m;j++) {
                data[i][j] = i * 10 + j;
            }
            data[i][8] = 0;
        }
    }

    bool operator == (const Node &node) const {
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= m;j++) {
                if(node.data[i][j] != data[i][j]) return false;
            }
        }
        return true;
    }
};

const Node tar;

Node q[maxq], val[maxq];
int head[maxq], nxt[maxq], sz;
int qs,qe;

int gethash(const Node &now) {
    int ret = 0;
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= m;j++) {
            ret = (ret << 6) + now.data[i][j];
        }
    }
    return ret & (maxq - 1);
}

bool exist(const Node &now) {
    int hc = gethash(now);
    for(int i = head[hc];~i;i = nxt[i]) {
        if(val[i] == now) return true;
    }
    val[sz] = now; nxt[sz] = head[hc];
    head[hc] = sz++;
    return false;
}

void expand(int x,int y,Node now) {
    bool found = false;
    int val = now.data[x][y - 1] + 1;
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= m;j++) if(now.data[i][j] == val) {
            now.data[i][j] = 0;
            now.data[x][y] = val;
            found = true;
            break;
        }
    }
    if(!found) return;
    if(!exist(now)) {
        now.dis++;
        q[qe % maxq] = now;
        qe++;
    }
}

int solve() {
    qs = qe = sz = 0;
    q[qe++] = Node(mp,0);
    memset(head,-1,sizeof(head));
    while(qs < qe) {
        Node now = q[qs % maxq]; qs++;
        if(now == tar) return now.dis;
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= m;j++) if(now.data[i][j] == 0) {
                expand(i,j,now);
            }
        }
    }
    return -1;
}

int main() {
    int T; scanf("%d",&T);
    while(T--) {
        for(int i = 1;i <= n;i++) {
            for(int j = 2;j <= m;j++) {
                scanf("%d",&mp[i][j]);
                if(mp[i][j] % 10 == 1) {
                    mp[mp[i][j] / 10][1] = mp[i][j];
                    mp[i][j] = 0;
                }
            }
        }
        printf("%d\n",solve());
    }
    return 0;
}

 

HDU 1067 Gap BFS+Hash

标签:blog   os   io   ar   for   数据   div   cti   log   

原文地址:http://www.cnblogs.com/rolight/p/3950087.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!