题意:在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初的玩具状态移动到某人心中的目标状态。

题解:状压状态,然后bfs时枚举每一位向四个方向转移即可,记得加vis,表示已经访问过的状态

/**************************************************************
Problem: 1054
User: walfy
Language: C++
Result: Accepted
Time:28 ms
Memory:6176 kb
****************************************************************/ //#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-6;
const int N=1000000+10,maxn=1000000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; bool vis[N];
int dis[N];
bool left(int u,int i)
{
if(i!=0&&i!=4&&i!=8&&i!=12&&(!((u>>(i-1))&1)))return 1;
return 0;
}
bool right(int u,int i)
{
if(i!=3&&i!=7&&i!=11&&i!=15&&(!((u>>(i+1))&1)))return 1;
return 0;
}
bool up(int u,int i)
{
if(i!=0&&i!=1&&i!=2&&i!=3&&(!((u>>(i-4))&1)))return 1;
return 0;
}
bool down(int u,int i)
{
if(i!=12&&i!=13&&i!=14&&i!=15&&(!((u>>(i+4))&1)))return 1;
return 0;
}
void bfs(int x,int y)
{
vis[x]=1;
queue<int>q;
q.push(x);
while(!q.empty())
{
int u=q.front();
if(u==y)
{
printf("%d\n",dis[u]);
return ;
}
q.pop();
for(int i=0;i<16;i++)
{
if((u>>i)&1)
{
if(left(u,i))
{
int te=u^(1<<i)^(1<<(i-1));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
if(right(u,i))
{
int te=u^(1<<i)^(1<<(i+1));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
if(up(u,i))
{
int te=u^(1<<i)^(1<<(i-4));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
if(down(u,i))
{
int te=u^(1<<i)^(1<<(i+4));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
}
}
}
}
char s[5];
int main()
{
int x=0,y=0;
for(int i=0;i<4;i++)
{
scanf("%s",s);
for(int j=0;j<4;j++)
if(s[j]=='1')
x+=(1<<(i*4+j));
}
for(int i=0;i<4;i++)
{
scanf("%s",s);
for(int j=0;j<4;j++)
if(s[j]=='1')
y+=(1<<(i*4+j));
}
bfs(x,y);
return 0;
}
/******************** ********************/

最新文章

  1. Android开发学习之路-让注解帮你简化代码,彻底抛弃findViewById
  2. C# 中excel操作
  3. 解决Win10默认占用80端口
  4. Scala第一章学习笔记
  5. 【英语】Bingo口语笔记(17) - 表示“感谢/不用客气“
  6. POJ 3258
  7. 洛谷比赛 Joe的数
  8. C#性能优化实践 资料整理
  9. 使用Iterator遍历Sheet(POI)验证及解释结果有序性
  10. webpack2使用ch10-处理图片(png jpg svg 等) 限制图片 压缩图片
  11. [学习OpenCV攻略][008][Canny边缘检测]
  12. ssh多台主机之间不用密码远程
  13. java中如何使用break跳出多重循环
  14. ceph问题总结
  15. SpringBoot日记——分布式篇
  16. MES方向准备
  17. 如何在页面中获取到ModelAndView绑定的值
  18. 『Python』setup.py简介
  19. hdu 4964 恶心模拟
  20. XML与HTML区别

热门文章

  1. Oracle 11g R2 RAC 高可用连接特性
  2. windows 文件查找 大小:&gt;250M
  3. jQuery.outerWidth() 函数具体解释
  4. [WorldWind学习]23.TerrainAccessor
  5. Hadoop MapReduce Task的进程模型与Spark Task的线程模型
  6. [py]类属性和实例属性
  7. java8中接口中的default方法
  8. 234. Palindrome Linked List(判断链表是否回文)
  9. 2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution
  10. 470. Implement Rand10() Using Rand7() (拒绝采样Reject Sampling)