码迷,mamicode.com
首页 > 移动开发 > 详细

[BZOJ 1054][HAOI 2008]移动玩具(BFS+判重)

时间:2014-12-05 21:23:26      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   os   sp   for   on   

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1054

真是水题,感谢HAOI送的福利样例23333

裸BFS,用string做判重,会八数码就会这题。

注意由于队列中状态数很多,一定要把队列的数组开大点!!!

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <map>

#define MAXN 5

using namespace std;

map<string,bool>visit;

int tmp[MAXN][MAXN],nowstatus[MAXN][MAXN];
int xx[]={1,-1,0,0},yy[]={0,0,1,-1};

bool inMap(int x,int y)
{
    if(x<1||x>4||y<1||y>4) return false;
    return true;
}

string GetPermutationFromArray()
{
    string ans="";
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            ans+=tmp[i][j]+'0';
    return ans;
}

void GetArrayFromPermutaion(string s)
{
    int p=0;
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            tmp[i][j]=s[p++]-'0';
}

struct node
{
    string status;
    int step;
}q[100000],first,goal;

int h=0,t=0;

int BFS()
{
    q[t++]=first;
    visit[first.status]=true;
    while(h<t)
    {
        node now=q[h++];
        if(now.status==goal.status) return now.step;
        GetArrayFromPermutaion(now.status);
        for(int x=1;x<=4;x++)
            for(int y=1;y<=4;y++)
            {
                if(tmp[x][y]==1) //(x,y)是玩具
                {
                    for(int dir=0;dir<4;dir++)
                    {
                        int tx=x+xx[dir],ty=y+yy[dir];
                        if(!inMap(tx,ty)) continue;
                        if(tmp[tx][ty]==0) //(tx,ty)是空地
                        {
                            node next;
                            next.step=now.step+1;
                            swap(tmp[x][y],tmp[tx][ty]);
                            next.status=GetPermutationFromArray();
                            if(!visit[next.status])
                            {
                                visit[next.status]=true;
                                q[t++]=next;
                            }
                            swap(tmp[x][y],tmp[tx][ty]);
                        }
                    }
                }
            }
    }
    return -1;
}

int main()
{
    string s;
    first.step=0;
    for(int i=1;i<=4;i++)
    {
        cin>>s;
        first.status+=s;
    }
    for(int i=1;i<=4;i++)
    {
        cin>>s;
        goal.status+=s;
    }
    printf("%d\n",BFS());
    return 0;
}



[BZOJ 1054][HAOI 2008]移动玩具(BFS+判重)

标签:style   blog   http   io   ar   os   sp   for   on   

原文地址:http://blog.csdn.net/qpswwww/article/details/41752905

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