sicily 简单魔板2
2012-09-19 09:03
281 查看
sicily上面的三道“简单魔板”的变形,开始以为数据变大了第一道题的解法行不通了,其实不然。网上看到用康托展开来进行存储状态的,发现其实对于这道题没能发挥康托展开的强大威力。
下面是找到别人的代码,自己加了一些注释(呜呜,我不想剽窃的。。。只是转载不了。。)
原文出处http://blog.csdn.net/bingleaf/article/details/6248371
关于康托展开,百度百科讲得非常详细了,看下就知道是什么东西了,算法实现也很简单,主要是其思想。。
其实这道题没必要使用康托编码,这里没发挥它的强大作用。因为从开始状态往下一层一层的搜不会出现太多的状态(试了下1000000步
也只是一万多种状态而已,所以康托编码没太多作用对于这道题)
下面是找到别人的代码,自己加了一些注释(呜呜,我不想剽窃的。。。只是转载不了。。)
原文出处http://blog.csdn.net/bingleaf/article/details/6248371
关于康托展开,百度百科讲得非常详细了,看下就知道是什么东西了,算法实现也很简单,主要是其思想。。
其实这道题没必要使用康托编码,这里没发挥它的强大作用。因为从开始状态往下一层一层的搜不会出现太多的状态(试了下1000000步
也只是一万多种状态而已,所以康托编码没太多作用对于这道题)
#include<iostream> #include<string> #include<queue> #include<memory.h> using namespace std; struct Board { int x[4]; int y[4]; string way; const Board operator=(const Board &p) { x[0]=p.x[0]; x[1]=p.x[1]; x[2]=p.x[2]; x[3]=p.x[3]; y[0]=p.y[0]; y[1]=p.y[1]; y[2]=p.y[2]; y[3]=p.y[3]; way=p.way; return *this; } }; int n; int x[4],y[4]; Board q; bool isvisit[50000];//用于搜索某状态是否曾经出现过 int fact[]={1,1,2,6,24,120,720,5040,40320};//8的阶乘表 //康托展开 int encode(Board p) { int sum=0; int cnt; int tmp[8]; for(int i=0;i<4;i++) { tmp[i]=p.x[i]; tmp[4+i]=p.y[i]; } for(int i=0;i<7;i++) //真正的康托展开在这里开始 { cnt=0; for(int j=i+1;j<8;j++) if(tmp[i]>tmp[j]) cnt++; //往低位寻找比它小的数字的个数 sum+=fact[8-i-1]*cnt; //比它小的数字数目乘以相应的阶乘 } return sum; } //a void a(Board p) { q.x[0]=p.y[0]; q.x[1]=p.y[1]; q.x[2]=p.y[2]; q.x[3]=p.y[3]; q.y[0]=p.x[0]; q.y[1]=p.x[1]; q.y[2]=p.x[2]; q.y[3]=p.x[3]; q.way=p.way+"A"; } //b void b(Board p) { q.x[0]=p.x[3]; q.x[1]=p.x[0]; q.x[2]=p.x[1]; q.x[3]=p.x[2]; q.y[0]=p.y[3]; q.y[1]=p.y[0]; q.y[2]=p.y[1]; q.y[3]=p.y[2]; q.way=p.way+"B"; } //c void c(Board p) { q.x[0]=p.x[0]; q.x[3]=p.x[3]; q.y[0]=p.y[0]; q.y[3]=p.y[3]; q.x[1]=p.y[1]; q.x[2]=p.x[1]; q.y[1]=p.y[2]; q.y[2]=p.x[2]; q.way=p.way+"C"; } bool equal(Board p) { for(int i=0;i<4;i++) { if(p.x[i]!=x[i]) return false; if(p.y[i]!=y[i]) return false; } return true; } void bfs() { Board p; p.x[0]=1; p.x[1]=2; p.x[2]=3; p.x[3]=4; p.y[0]=8; p.y[1]=7; p.y[2]=6; p.y[3]=5; p.way=""; queue<Board> magic; isvisit[encode(p)]=true; magic.push(p); while(!magic.empty()) { p=magic.front(); magic.pop(); if(p.way.size()>n) { cout<<"-1"<<endl; return; } if(equal(p)) { cout<<p.way.size()<<" "<<p.way<<endl; return; } a(p); if(!isvisit[encode(q)]) { isvisit[encode(q)]=true; magic.push(q); } b(p); if(!isvisit[encode(q)]) { isvisit[encode(q)]=true; magic.push(q); } c(p); if(!isvisit[encode(q)]) { isvisit[encode(q)]=true; magic.push(q); } } } int main() { while(cin>>n&&n!=-1) { memset(isvisit,false,sizeof(isvisit)); cin>>x[0]>>x[1]>>x[2]>>x[3]; cin>>y[0]>>y[1]>>y[2]>>y[3]; bfs(); } return 0; }
相关文章推荐
- sicily 1150 简单魔板 & 1151 魔板 bfs
- [sicily online]1150. 简单魔板
- sicily 简单魔板
- Sicily 1150 简单魔板 && 1151 魔板 (BFS深度优先搜索+康托展开状态压缩)
- sicily 1150 简单魔板 sicily 1151 魔板 sicily 1515 魔板C
- Sicily 1150. 简单魔板 解题报告
- sicily 1150. 简单魔板
- Sicily 1150. 简单魔板[Speical judge]
- Sicily 1150. 简单魔板
- sicily 1150 简单魔板
- sicily 1050 简单魔板
- Sicily 1150. 简单魔板
- sicily 1150. 简单魔板 & 1151. 魔板
- sicily 1150. 简单魔板
- sicily 1150 简单魔板 sicily 1151 魔板 sicily 1515 魔板C
- Sicily1150 简单魔板
- Sicily-AVLtree的简单构建
- sicily 1152 简单的马周游问题 and sicily 1153 马的周游问题
- Sicily 1152. 简单的马周游问题
- Sicily 1190. Reduced ID Numbers 简单哈希