1054: [HAOI2008]移动玩具
2015-12-10 10:54
429 查看
4x4的图压成16位二进制数,bfs就好了。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int dx[4]={0,1,0,-1}; const int dy[4]={1,0,-1,0}; bool vis[500005]; int mp[10][10]; void cod(int s){ for(int i=1;i<=4;i++) for(int j=1;j<=4;j++){ mp[i][j]=s&1; s>>=1; } } int recod(){ int ans=0; for(int i=4;i>=1;i--) for(int j=4;j>=1;j--){ ans<<=1; ans|=mp[i][j]; } return ans; } int bfs(int s,int t){ if(s==t)return 0; queue<int>q,d;q.push(s);d.push(0);vis[s]=true; while(!q.empty()){ int u=q.front(),tmp=d.front();q.pop();d.pop(); cod(u); for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) if(mp[i][j]){ for(int k=0;k<4;k++){ int tx=i+dx[k],ty=j+dy[k]; if(mp[tx][ty]||tx<1||tx>4||ty<1||ty>4)continue; mp[tx][ty]=1; mp[i][j]=0; int v=recod(); if(!vis[v]){ vis[v]=true; q.push(v);d.push(tmp+1); if(v==t)return tmp+1; } mp[i][j]=1; mp[tx][ty]=0; } } } } char ch[10]; int main(){ for(int i=1;i<=4;i++){ scanf("%s",ch+1); for(int j=1;j<=4;j++) mp[i][j]=ch[j]-'0'; } int s=recod(); for(int i=1;i<=4;i++){ scanf("%s",ch+1); for(int j=1;j<=4;j++) mp[i][j]=ch[j]-'0'; } int t=recod(); printf("%d",bfs(s,t)); return 0; }
相关文章推荐
- SB/XIB使用过程报错处理
- 如何为drawable着色
- 前端知识体系
- 企业级统一身份认证4A体系
- Mindjet -- 项目需求整理分析
- LightOJ 1294 - Positive Negative Sign【数学】
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
- 按照字典里面某一个字段排序实现
- hadoop如何处理长时间运行不完成的map/reduce 任务?
- 博客收藏--sailing的博客
- poj 2566Bound Found(前缀和,尺取法)
- 理解tornado
- 配置域主DNS服务器
- 使用UITouch隐藏UITextField/UITextView输入键盘的方法-iOS开发
- 来玩Play框架02 响应
- Android 5.1 添加硬件抽象层(HAL)和JNI接口总结
- 使用spyder+pandas清洗数据
- Roman To Integer leetcode java
- 查看mysql库大小,表大小,索引大小
- druid简单教程