显然这道题可以用bfs解决。我们可以首先得到8种横竖斜之和均为15的情况,然后给它们赋予一个值,从这八种情况扩展,开一个dis数组记录某种情况所需要的步数,然后扩展出哪种就给哪种步数+1就行了。但关键是dis数组的范围,倘若按照从数字编号,dis是肯定存不下的。我们注意到9个数的全排列是9!种,362200种可能,这个数还是比较小的,所以我们可以考虑把情况压缩成这种状态,但如何操作呢?这里就要用到康托展开(附上链接:https://blog.csdn.net/wbin233/article/details/72998375)。通过这种方法我们可以解决这个问题。注意有几个小技巧,往队列里添加初始的八种状态时可以让它们的step=1,然后判重时如果dis为0就添加到队列里去,这样可以省去bool类型的判重数组,最后答案减去1就可以了,同样也解决了不存在答案输出-1的情况。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int fac[]={1,1,2,6,24,120,720,5040,40320,362880};
struct node
{int map[4][4];int step;
}team[4000000];
int dis[4000000];
int s,t;
int getnum(int map[4][4])
{int num=0;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){num=num*10+map[i][j];}}return num;
}
int change(int x)
{bool b[10]={0};int ans=0;int p=8;while(x){int cnt=0;int tmp=x%10;for(int i=1;i<tmp;i++){if(!b[i]) {cnt++;}}b[tmp]=true;ans+=cnt*fac[p];p--;x/=10;}return ans;
}
void add(int x,int step)
{t++;dis[change(x)]=step;for(int i=3;i>=1;i--){for(int j=3;j>=1;j--){team[t].map[i][j]=x%10;x/=10;}}team[t].step=step;
}
void bfs()
{while(s!=t){s++;node now=team[s];
//      cout<<s<<' '<<t<<' '<<now.num<<' '<<now.step<<endl;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){if(i+1<=3){swap(now.map[i][j],now.map[i+1][j]);int num=getnum(now.map);if(dis[change(num)]==0){add(num,now.step+1);    } swap(now.map[i][j],now.map[i+1][j]);}if(j+1<=3){swap(now.map[i][j],now.map[i][j+1]);int num=getnum(now.map);if(dis[change(num)]==0) {add(num,now.step+1);  }swap(now.map[i][j],now.map[i][j+1]);}}}}return ;
}
int main()
{add(816357492,1);add(438951276,1);add(294753618,1);add(672159834,1);add(618753294,1);add(276951438,1);add(492357816,1);add(834159672,1);bfs();int t=50;while(t--){int num=0;for(int i=1;i<=9;i++){int c;cin>>c;num=num*10+c;}printf("%d\n",dis[change(num)]-1);}return 0;
}

【题解】vijos P1029 晴天小猪历险记之number(bfs 康托展开)相关推荐

  1. Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】

    Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...

  2. Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  3. vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化

    题目链接:https://vijos.org/p/1006 数字三角形原题看这里:http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久 ...

  4. Vijos1029[晴天小猪历险记之Number] 搜索+康托展开

    康托展开: 康托展开表示的是当前n个元素排列在n个不同元素的全排列中的名次. 比如213在这3个数所有排列中排第3. 那么,对于n个数的排列,康托展开为: ans=an*(n-1)!+an-1*(n- ...

  5. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  6. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  7. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  8. VIjos 晴天小猪历险记之Number (搜索+链表hash)

    背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空无一人?但在屋中央有一 ...

  9. hdu.1430.魔板(bfs + 康托展开)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

最新文章

  1. Window环境下配置MySQL 5.6的主从复制、备份恢复
  2. Apache 启动提示undefined symbol: libiconv_open
  3. matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
  4. 计算机科学千分之一高校,69所计算机科学进入ESI世界前1%的高校及排名,西电全国第四!...
  5. Mac模拟慢速网络 - Network Link Conditioner 安装和使用
  6. nginx+tomcat 反向代理 负载均衡配置
  7. [BZOJ2125]最短路
  8. js与flash结合使用
  9. 数字化转型方法论_老板让我搞数字化转型?成功之后,我整理了这套超全的方法论...
  10. java audiostream 用不了_AudioInputStream不起作用
  11. Android开发— 2016_最流行的Android组件、工具、框架大全(二)
  12. 菜鸟版JAVA设计模式-从抽象与实现说桥接模式
  13. mongodb 基础 命令 学习
  14. 无人机航拍VR全景图片怎么制作?
  15. ChinaSoft 论坛巡礼 | CCF-华为胡杨林基金-软件工程专项论坛
  16. 资深黄金专家李鑫:独创7套算点理论震惊市场
  17. Win8笔记本不能正常关机或重启
  18. Error while extracting response for type
  19. 怎么在一台电脑登录多个微信公众号客服-微信公众号使用教程25
  20. xcode安装ipa包

热门文章

  1. “云”筹帷幄 “数”治天下 天翼云的“智”与“志”
  2. 前端布局:圣杯布局/双飞翼布局(两者小小的区别)
  3. pulsar架构与原理
  4. 删除Office Word (Excel)中Recent Document最近文档中本地和online打开文件路径已经不存在的文件记录
  5. 计算序列 1 + 2 + 3 + ... 的前N项之和。
  6. android动态设置maxWidth,如何使用android:maxWidth?
  7. Windows错误码2503和2502
  8. 23种设计模式(7):原型模式
  9. RedPackage
  10. 毕业四年同学聚会,性格决定命运----作者:伤心小叶