【wikioi】1225八数码问题
2014-05-14 21:49
429 查看
#include<cstdlib> #include<cstring> #include<iostream> #include<queue> using namespace std; const int N=20000000; queue < string > Q1; queue < int > Q2; int jc[9]={1,1,2,6,24,120,720,5040,40320}; bool p ; int cmp; int hashnum(string st) { int a[9],ans=1,i,j; for (i=1;i<=9;i++) a[i]=st[i-1]-48; for (i=1;i<=9;i++) { int sum=0; for (j=i+1;j<=9;j++) if (a[j]<a[i]) sum++; ans+=sum*jc[9-i]; } return ans; } string work1(string s) { int a[10],j; for (int i=1;i<=9;i++){//字符串转化为数字 a[i]=s[i-1]-48; if (a[i]==0) j=i; } if (j<4) return s; a[0]=a[j]; a[j]=a[j-3]; a[j-3]=a[0]; s=""; for (int i=1;i<=9;i++) s+=(a[i]+48); return s; } string work2(string s) { int a[10],j; for (int i=1;i<=9;i++){ a[i]=s[i-1]-48; if (a[i]==0) j=i; } if (j%3==0) return s; a[0]=a[j]; a[j]=a[j+1]; a[j+1]=a[0]; s=""; for (int i=1;i<=9;i++) s+=(a[i]+48); return s; } string work3(string s) { int a[10],j; for (int i=1;i<=9;i++){ a[i]=s[i-1]-48; if (a[i]==0) j=i; } if (j%3==1) return s; a[0]=a[j]; a[j]=a[j-1]; a[j-1]=a[0]; s=""; for (int i=1;i<=9;i++) s+=(a[i]+48); return s; } string work4(string s) { int a[10],j; for (int i=1;i<=9;i++){ a[i]=s[i-1]-48; if (a[i]==0) j=i; } if (j>6) return s; a[0]=a[j]; a[j]=a[j+3]; a[j+3]=a[0]; s=""; for (int i=1;i<=9;i++) s+=(a[i]+48); return s; } int bfs(int k,string s) { Q1.push(s);Q2.push(k); while (!Q1.empty()) { s=Q1.front();k=Q2.front(); Q1.pop();Q2.pop(); int num=hashnum(s); if (num==cmp) return k; if (p[num]) continue;else p[num]=1; Q1.push(work1(s));Q2.push(k+1); Q1.push(work2(s));Q2.push(k+1); Q1.push(work3(s));Q2.push(k+1); Q1.push(work4(s));Q2.push(k+1); } } int main() { string s="123804765";要达到的目标状态 cmp=hashnum(s); cin>>s; work1(s); cout<<bfs(0,s)<<endl; return 0; }
相关文章推荐
- wikioi 1225八数码难题
- 八数码问题——A*搜索
- 八数码问题
- A*算法在八数码问题上的应用
- 八数码问题之盲目式搜索法(双向搜索法)
- 趣味编程:用BGL求解八数码问题(A*)
- 8 Puzzle/8 数码问题
- 八数码问题分析
- pku 1077 Eight 经典8数码问题 单向BFS + A* BFS + 双向BFS
- 用java语言实现八数码问题--广度优先搜索
- 用java实现人工智能中的A*算法求8数码问题
- 八数码问题的三种算法解答(C#源代码)
- ZJU2004 Commedia dell'arte - 八数码问题有解的条件及其推广
- 八数码问题
- 八数码问题的三种算法解答(C#源代码) (补充)
- 八数码问题完全版-是否可解判断及求解
- 十五数码问题
- 八数码问题(启发式搜索)
- 启发式搜索程序设计-八数码问题
- 数码城竞选海报问题;空间换时间;类似于哈希表的思想一样;过一阵贴上另一种的算法;