题记:写这篇博客要主是加深自己对交换地方的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。
标题址地: http://acm.hdu.edu.cn/showproblem.php?pid=1195
一个标准的宽搜,一点不须要剪枝
须要意注的一点是:交换的时候,这个地方只能交换街坊,我时当看错为以可以意任交换
代码如下:
#include <iostream> #include <queue> using namespace std; int a[5],b[5]; bool visit[10010]; int hashb; struct xh { int d[5]; int t; }w,ww; int hash(int x[]) { int i,sum=0; for(i=1;i<=4;i++) sum=sum*10+x[i]; return sum; } int add(int n) { if(n==9) return 1; return n+1; } int jian(int n) { if(n==1) return 9; return n-1; } int bfs() { int i,j,hashx; memset(visit,false,sizeof(visit)); queue<xh>q; for(i=1;i<=4;i++) w.d[i]=a[i]; w.t=0; hashx=hash(a); visit[hashx]=true; q.push(w); while(!q.empty()) { ww=q.front(); q.pop(); if(hash(ww.d)==hashb) { printf("%d\n",ww.t); break; } //加一减一 for(i=1;i<=4;i++) { w=ww;//加一 w.d[i]=add(w.d[i]); hashx=hash(w.d); if(!visit[hashx]) { visit[hashx]=true; w.t++; q.push(w); } w=ww;//减一 w.d[i]=jian(w.d[i]); hashx=hash(w.d); if(!visit[hashx]) { visit[hashx]=true; w.t++; q.push(w); } } //交换,这个地方只能交换街坊,我时当看错了标题 for(i=1;i<4;i++) { w=ww; swap(w.d[i],w.d[i+1]); hashx=hash(w.d); if(!visit[hashx]) { visit[hashx]=true; w.t++; q.push(w); } } } } int main() { int i,j,n,T; char c; cin>>T; while(T--) { for(i=1;i<=4;i++) { cin>>c; a[i]=c-'0'; } for(i=1;i<=4;i++) { cin>>c; b[i]=c-'0'; } hashb=hash(b); bfs(); } return 0; }
文章结束给大家分享下程序员的一些笑话语录:
手机终究会变成PC,所以ip会比wm更加畅销,但是有一天手机强大到一定程度了就会发现只有wm的支持才能完美享受。就好比树和草,草长得再高也是草,时间到了条件成熟了树就会窜天高了。www.ishuo.cn