题记:写这篇博客要主是加深自己对交换地方的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。
标题址地: 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