• [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
    

    Solution

    状态比较少,可以状压dp,由于转移顺序不确定,需要bfs转移。

    #include<bits/stdc++.h>
    using namespace std;
     
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
     
    void print(int x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(int x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    const int maxn = 2e5+10;
    
    int s[5][5],f[70000],en;
    char c[10];
    
    const int dx[] = {0,0,0,1,-1};
    const int dy[] = {0,1,-1,0,0};
    const int dt[] = {0,-1,1,-4,4};
    
    int encode() {
    	int x=0;
    	for(int i=1;i<=4;i++)
    		for(int j=1;j<=4;j++)
    			x=(x<<1)+s[i][j];
    	return x;
    }
    
    void decode(int x) {
    	for(int i=4;i;i--)
    		for(int j=4;j;j--)
    			s[i][j]=x&1,x>>=1;
    }
    
    int check(int x,int y) {
    	if(x>4||x<=0||y>4||y<=0||s[x][y]) return 0;
    	return 1;
    }
    
    void bfs() {
    	queue<int > q;q.push(en=encode()),f[en]=0;
    	while(!q.empty()) {
    		int now=q.front();q.pop();
    		decode(now);
    		for(int i=1;i<=4;i++)
    			for(int j=1;j<=4;j++)
    				if(s[i][j]) {
    					int bit=4*(4-i)+4-j,v;
    					for(int k=1,x,y;k<=4;k++)
    						if(check(x=i+dx[k],y=j+dy[k])) 
    							if(f[v=(now^(1<<bit))|(1<<(bit+dt[k]))]>f[now]+1)
    								f[v]=f[now]+1,q.push(v);
    				}
    	}
    }
    
    int main() {
    	for(int i=1;i<=4;i++) {
    		scanf("%s",c+1);
    		for(int j=1;j<=4;j++) s[i][j]=c[j]-'0';
    	}memset(f,63,sizeof f);
    	bfs();
    	for(int i=1;i<=4;i++) {
    		scanf("%s",c+1);
    		for(int j=1;j<=4;j++) s[i][j]=c[j]-'0';
    	}write(f[encode()]);
    	return 0;
    }
    
  • 相关阅读:
    HttpClient4.5 post请求xml到服务器
    关于spring mybateis 定义resultType="java.util.HashMap"
    Git安装和使用(谨记)
    使用 Lombok 简化项目中无谓的Java代码
    为什么JSP会比Beetl慢
    Apache Commons Codec 与消息摘要算法(hash算法)
    加密解密基础问题:字节数组和(16进制)字符串的相互转换
    Spring AOP 不同配置方式产生的冲突问题
    Java 权限框架 Shiro 实战二:与spring集成、filter机制
    Java 权限框架 Shiro 实战一:理论基础
  • 原文地址:https://www.cnblogs.com/hbyer/p/10390301.html
Copyright © 2020-2023  润新知