首页 > 代码库 > bzoj 1054: [HAOI2008]移动玩具 bfs
bzoj 1054: [HAOI2008]移动玩具 bfs
1054: [HAOI2008]移动玩具
Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss]
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
0000
1110
0010
1010
0101
1010
0101
Sample Output
4
#include<bits/stdc++.h>using namespace std;#define ll long long#define pi (4*atan(1.0))#define eps 1e-14const int N=2e5+10,M=1e6+10,inf=1e9+10,mod=1e9+7;const ll INF=1e18+10;struct is{ char a[5][5]; int step;};char mp[5][5];char ans[5][5];map<string,int>m;string check(char mp[][5]){ string a=""; for(int i=0;i<4;i++) for(int t=0;t<4;t++) a+=mp[i][t]; return a;}queue<is>q;int ff(int x,int y){ if(x<0||x>=4||y<0||y>=4) return 0; return 1;}int xx[4]={0,1,0,-1};int yy[4]={1,0,-1,0};int main(){ for(int i=0;i<4;i++) scanf("%s",mp[i]); for(int i=0;i<4;i++) scanf("%s",ans[i]); m[check(mp)]=1; is f; for(int i=0;i<4;i++) for(int t=0;t<4;t++) f.a[i][t]=mp[i][t]; f.step=0; q.push(f); int out; while(!q.empty()) { is b=q.front(); q.pop(); int flag=1; for(int i=0;i<4;i++) { for(int t=0;t<4;t++) if(b.a[i][t]!=ans[i][t]) { flag=0; break; } } if(flag) { out=b.step; break; } for(int i=0;i<4;i++) { for(int t=0;t<4;t++) if(b.a[i][t]==‘1‘) { for(int j=0;j<4;j++) { int xxx=i+xx[j]; int yyy=t+yy[j]; //cout<<xxx<<" "<<yyy<<" "<<ff(xxx,yyy)<<endl; if(ff(xxx,yyy)&&b.a[xxx][yyy]==‘0‘) { b.a[xxx][yyy]=‘1‘; b.a[i][t]=‘0‘; b.step++; if(m[check(b.a)]==0) q.push(b),m[check(b.a)]=1; b.step--; b.a[xxx][yyy]=‘0‘; b.a[i][t]=‘1‘; } } } } } printf("%d\n",out); return 0;}
bzoj 1054: [HAOI2008]移动玩具 bfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。