ztx

[HAOI2008]移动玩具

Posted on 2015年1月17日 16:56
/****************************************\
* Author : ztx
* Title  : [HAOI2008]移动玩具
* ALG    : 搜索 + hash剪枝
* CMT    :
* Time   :
\****************************************/
/****************************************\
* Author : ztx
* Title  : [HAOI2008]移动玩具
* ALG    : 搜索 + hash剪枝
* CMT    :
* Time   :
\****************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std ;

#define  maxs  65536LL

const int dx[4] = {0 , 0 , 1 , -1} ,
          dy[4] = {1 , -1 , 0 , 0} ;

struct data { bool a[5][5] ; int step ; } q[maxs] ;

int Start , End , h ;
bool ans[5][5] , exist[maxs] ;

int hash(bool a[5][5]) {
    int k = 1 , s = 0 , i , j ;
    for (i = 1 ; i < 5 ; i ++ )
        for (j = 1 ; j < 5 ;j ++ )
            s += k*a[i][j] , k <<= 1 ;
    return s ;
}

int main() {
//  #define READ
    #ifdef  READ
        freopen(".in" ,"r",stdin ) ;
        freopen(".out","w",stdout) ;
    #endif
    int t = 0 , w = 1 , i , j , k , x , y ;
    char ch[5] ;
    for (i = 1 ; i < 5 ; i ++ ) {
        scanf("%s", ch) ;
        for(j = 1 ; j <= 4 ; j ++ )
           q[0].a[i][j] = ch[j-1]-'0' ;
    }
    for(i = 1 ; i <= 4 ; i ++ ) {
        scanf("%s",ch);
        for(j = 1 ; j <= 4 ; j ++ )
           ans[i][j] = ch[j-1]-'0' ;
    }
    Start = hash(q[t].a) ;
    End = hash(ans) ;
    if (Start == End) {
        puts("0") ; goto END ;
    }
    exist[Start] = 1 ;
    while (t < w) {
        for(i = 1 ; i < 5 ; i ++ )
            for (j = 1 ; j < 5 ; j ++ ) if (q[t].a[i][j])
                for (k = 0 ; k < 4 ; k ++ ) {
                    x = i+dx[k] , y = j+dy[k] ;
                    if (q[t].a[x][y] || x>4 || y>4 || x<1 || y<1) continue ;
                    swap(q[t].a[i][j] , q[t].a[x][y]) ;
                    h = hash(q[t].a) ;
                    if (!exist[h]) {
                        if (h == End) {
                            printf("%d", q[t].step+1) ; goto END ;
                        }
                        exist[h] = 1 ;
                        memcpy(q[w].a , q[t].a , sizeof q[w].a) ;
                        q[w].step = q[t].step+1 ;
                        w ++ ;
                    }
                    swap(q[t].a[i][j] , q[t].a[x][y]) ;
                }
        t ++ ;
    }
    END : ;
    #ifdef  READ
        fclose(stdin) ; fclose(stdout) ;
    #else
        getchar() ; getchar() ;
    #endif
    return 0 ;
}