滑块
来源:互联网 发布:淘宝培训公司靠谱吗 编辑:程序博客网 时间:2024/04/30 12:47
题意(原题):
给出起始与目标两个3*3的矩阵,矩阵内数由0-8组成且互不相同。每次操作可以将0上下左右的任意数与0交换。求到达目标矩阵的最小步数。
思路(请先预习康托展开):
把每个状态进行康托展开成为一个数,随即宽搜即可。
代码:
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>using namespace std;struct node{ int x,y,deep,a[4][4]; node() { x=y=deep=0; memset(a,0,sizeof(a)); }}list[410000];int fx[]={0,-1,1,0,0};int fy[]={0,0,0,-1,1};int Ktx[100],jc[100];bool useAble[100],v[410000];int Kt(node x){ memset(useAble,true,sizeof(useAble)); for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) Ktx[(i-1)*3+j]=x.a[i][j]+1; int ans=0,cnt; for(int i=1;i<=9;i++) { cnt=0; for(int j=1;j<Ktx[i];j++) if(useAble[j]) cnt++; useAble[Ktx[i]]=false; ans+=cnt*jc[9-i]; } return ans+1;}void memsetjc(){ jc[0]=1; for(int i=1;i<=9;i++) jc[i]=jc[i-1]*i;}void swap(int &x,int &y){ int t=x;x=y;y=t;}int main(){ memsetjc(); int st,ed,head,tail; node sxde,edNode; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) { scanf("%d",&sxde.a[i][j]); if(sxde.a[i][j]==0) sxde.x=i,sxde.y=j; } for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) { scanf("%d",&edNode.a[i][j]); if(edNode.a[i][j]==0) edNode.x=i,edNode.y=j; } st=Kt(sxde);ed=Kt(edNode); head=1;tail=2;memset(v,true,sizeof(v));list[1]=sxde; while(head<=tail) { node x=list[head]; for(int i=1;i<=4;i++) { node y=x; y.x+=fx[i];y.y+=fy[i];y.deep=x.deep+1; if(y.x<=3&&y.x>=1&&y.y<=3&&y.y>=1) { swap(y.a[y.x][y.y],y.a[x.x][x.y]); int z=Kt(y); if(v[z]) { if(z==ed) { printf("%d\n",y.deep); return 0; } v[z]=false; list[tail++]=y; } } } head++; } return 0;}
阅读全文
0 0
- 滑块
- 滑块
- 滑块
- 滑块演示
- ListView自定义滑块
- slider滑块用法
- 添加滑块
- Android unity3d 滑块
- UISlider滑块控件
- slider滑块用法
- 滑块按钮
- 滑块代码
- UISlider滑块控件
- Android星级滑块
- UISlider:滑块控件
- jquery 进度条 滑块
- UISlider 滑块控件
- UISlider/滑块
- Socket描述符解释
- springData+spring+springMVC整合
- 剑指offer——面试题10:二进制中1的个数
- react.js相关帖子
- java工程师初进公司的准备工作
- 滑块
- 海思--Hi3516aMpp开发环境配置
- 变量和表达式
- QTcpSocket类和QTcpServer类
- Unity使用C#不失真修改图片的分辨率
- 线性表之基于链表的实现
- 扉页
- Oracle分组统计查询-分组查询
- C/C++ 数组传参原理