bzoj 1054 移動玩具

來源:互聯網
上載者:User

標籤:

題目串連

http://www.lydsy.com/JudgeOnline/problem.php?id=1054  

移動玩具Description

在一個4*4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。

Input

前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒有放置玩具。接著是一個空行。接下來4行表示玩具的目標狀態,每行4個數字1或0,意義同上。

Output

一個整數,所需要的最少移動次數。

Sample Input

1111
0000
1110
0010

1010
0101
1010
0101

Sample Output

4

資料很小直接暴搜。。

#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<map>using std::min;using std::sort;using std::pair;using std::swap;using std::vector;using std::multimap;#define pb(e) push_back(e)#define sz(c) (int)(c).size()#define mp(a, b) make_pair(a, b)#define all(c) (c).begin(), (c).end()#define iter(c) __typeof((c).begin())#define cls(arr, val) memset(arr, val, sizeof(arr))#define cpresent(c, e) (find(all(c), (e)) != (c).end())#define rep(i, n) for(int i = 0; i < (int)n; i++)#define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)const int N = 1000000;const int INF = 0x3f3f3f3f;bool vis[N];struct Node {    int s;    bool mat[4][4];}que[N], end;const int dx[] = { 0, 0, -1, 1 }, dy[] = { -1, 1, 0, 0 };inline int hash(Node &x) {    int ret = 0, k = 1;    rep(i, 4) {        rep(j, 4) {            ret += k * x.mat[i][j];            k <<= 1;        }    }    return (ret + N) % N;}inline void read(Node &x) {    char buf[10];    rep(i, 4) {        scanf("%s", buf);        rep(j, 4) {            x.mat[i][j] = buf[j] - ‘0‘;        }    }}void bfs() {    int lb = 0, ub = 0, ret, ans;    ret = hash(que[0]), ans = hash(end);    if(ret == ans) { puts("0"); return; }    ub++, cls(vis, false), vis[ret] = true;    while(lb != ub) {        Node &x = que[lb++];        ret = hash(x);        if(ret == ans) { printf("%d\n", x.s); return; }        rep(i, 4) {            rep(j, 4) {                if(!x.mat[i][j]) continue;                rep(k, 4) {                    int nx = dx[k] + i, ny = dy[k] + j;                    if(nx < 0 || nx >= 4 || ny < 0 || ny >= 4) continue;                    if(x.mat[nx][ny]) continue;                    Node &t = que[ub];                    t = x, t.s = x.s + 1;                    swap(t.mat[i][j], t.mat[nx][ny]);                    ret = hash(t);                    if(vis[ret]) continue;                    vis[ret] = true;                    ub++;                }            }        }    }    puts("0");}int main() {#ifdef LOCAL    freopen("in.txt", "r", stdin);    freopen("out.txt", "w+", stdout);#endif    read(que[0]), read(end);    bfs();    return 0;}

bzoj 1054 移動玩具

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.