之前搜索是我特别讨厌的一个东西,这几天一直在学广搜,反倒学出了一点儿心得。昨天晚上比赛的时候,一道需要对搜索做出一些变形的题目我做了出来,这道题我看到的第一反应也意识到是用搜索去做。我很欣慰啊。
昨天晚上没睡好,今天一天头昏眼花的,刚才觉得看题目都看错了。
我好像太喜欢在解题报告前面唠嗑了……
题目中将两个点的位置放在了一条线上,然后规定了点的三种移动方式,这跟一般的迷宫搜索一模一样,不过是一般的广搜点的移动方式是上下左右四种,而这道题是前后和*2三种方式。这样理解的话,这道题就变成了一道很简单的广搜题。
#include<stdio.h>
#include<queue>
using namespace std;
#define N 100005
int mark[N];
int m,n;
struct node
{
int x,step;
};
int judge(int x)
{
if(x>=0&&x<=100000&&mark[x]==0)
return 1;
return 0;
}
int bfs()
{
queue<node>q;
node cur,next;
memset(mark,0,sizeof(mark));
cur.x=m;
cur.step=0;
q.push(cur);
mark[m]=1;
while(!q.empty())
{
cur=q.front();
if(cur.x==n)
return cur.step;
q.pop();
next.step=cur.step+1;
next.x=cur.x-1;
if(judge(next.x))
{
mark[next.x]=1;
q.push(next);
}
next.x=cur.x+1;
if(judge(next.x))
{
mark[next.x]=1;
q.push(next);
}
next.x=cur.x*2;
if(judge(next.x))
{
mark[next.x]=1;
q.push(next);
}
}
return -1;
}
int main()
{
int count;
while(scanf("%d%d",&m,&n)!=EOF)
{
count=bfs();
printf("%d\n",count);
}
return 0;
}