洛谷P4289 移动玩具 HAOI2008 搜索+状压

正解:状压

解题报告:

先,放下传送门QwQ

说真的我jio得这题不管是思路还是实现上,都还是有一定难度的?然后就看到神仙hl博客里一句"太水了不讲了"就过掉了,,,好的趴太强辽QAQ

但是这题我开始是真的没想到状压,,,知道状压之后实现代码实现了好久,,,看来灵巧是真的菜趴QAQ

然后就讲下这题QwQ

首先这题,一眼bfs板子题嘛,大体的框架应该都还是想得出来的

但是如果!你和sd灵巧想到了一个路子上!直接存的矩阵!你就可以获得10pts的好成绩,,,显然会MLE的啊喂!

然后就考虑,它不是只有01嘛,显然状压鸭!

然后照理来说就做完了

然而sd灵巧代码实现能力太差了,,,打了俩小时死活调不出来,,,就放弃了,拿的hl的代码改了下过的(但改动挺大的我jio得,比他代码好看多了2333333

然后另外注意一下还用了俩优化(不过似乎不用也能A?

一个是双向搜索,通过beg和tail实现的

另一个是显然的一个结论,就是对于俩俩交换你只用搜和左边交换和上边交换,和右和下的显然会被别的格子枚举到,就可以/2了(也没快多少的说QAQ

没了,放下代码就跑了!

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define ll int
#define mp make_pair
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)
;
ll beg[N],tail[N],ans,temp[][],dx[]={,,},dy[]={,,},t1;
queue< ll > q;

inline ,)my(j,,){temp[i][j]=x&;x>>=;}}
inline ;rp(i,,)rp(j,,){ret<<=;ret|=temp[i][j];}return ret;}
inline  && y< && x> && y>;}
inline int bfs(void)
{
    while(!q.empty())
    {
        ;frhash(now);q.pop();
        rp(i,,)
            rp(j,,)
                rp(k,,)
                    if(jde(i+dx[k],j+dy[k]))
                    {
                        swap(temp[i][j],temp[i+dx[k]][j+dy[k]]);tp=tohash();
                        ;
                        ,q.push(tp);
                        ,q.push(tp);
                        swap(temp[i][j],temp[i+dx[k]][j+dy[k]]);
                    }
    }
}

int main()
{
    rp(t,,)rp(i,,)scanf(;q.push(t1);
    rp(t,,)rp(i,,)scanf(;q.push(t1);
    cout<<bfs()<<endl;
    ;
}
上一篇:BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)


下一篇:[bzoj3306]树——树上倍增+dfs序+线段树