• 【BZOJ1054】[HAOI2008]移动玩具 BFS


    【BZOJ1054】[HAOI2008]移动玩具

    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

    题解:把4x4矩阵压成16位的二进制数,然后跑BFS

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <queue>
    using namespace std;
    char str[10];
    int s,t,u,v;
    int d[1<<16],w[]={1,-1,4,-4};
    queue<int> q;
    void move(int i)
    {
    	if(v&(1<<i))	return ;
    	int x=v+(1<<i);
    	if(d[x])	return ;
    	d[x]=d[u]+1;
    	q.push(x);
    }
    int main()
    {
    	int i,j;
    	for(i=0;i<4;i++)
    	{
    		scanf("%s",str);
    		for(j=0;j<4;j++)	s=s*2+str[j]-'0';
    	}
    	for(i=0;i<4;i++)
    	{
    		scanf("%s",str);
    		for(j=0;j<4;j++)	t=t*2+str[j]-'0';
    	}
    	q.push(s);
    	d[s]=1;
    	while(!q.empty())
    	{
    		u=q.front(),q.pop();
    		for(i=0;i<16;i++)
    		{
    			if((1<<i)&u)
    			{
    				v=(1<<i)^u;
    				if(i%4>0)	move(i-1);
    				if(i%4<3)	move(i+1);
    				if(i/4>0)	move(i-4);
    				if(i/4<3)	move(i+4);
    				if(d[t])
    				{
    					printf("%d",d[t]-1);
    					return 0;
    				}
    			}
    		}
    	}
    }
  • 相关阅读:
    .Net Attribute详解(下)
    .Net Attribute详解(上)-Attribute本质以及一个简单示例
    美国快递跟踪链接
    ffmpeg中AVBuffer的实现分析
    Android Studio创建JAR/AAR库
    Android Studio添加原生库并自动构建
    代码注释中的专有词——TODO、FIXME和XXX
    adb获得安卓系统版本及截屏
    FFmpeg libavutil主要功能概述
    Linux下库打桩机制分析 function Interposition
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6441218.html
Copyright © 2020-2023  润新知