题意,一条数轴上,告诉你起点和终点,只能向前走1,向后走1,或者走到二倍的现在的位置,每次都耗时一分钟。问从起点到终点的最短时长。

简单地bfs

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <queue>
#include <vector>
#include <set>
#include <cmath>
#define inf 0x7fffffff
using namespace std;
int n,k,a[],flag[];
int bfs(){
queue<int> q;
q.push(n);
while(q.size()){
int p=q.front();
q.pop();
if(p==k) break;
for(int i=;i<;i++)
{
if(!i&&p>&&!flag[p-])
{
q.push(p-);
a[p-]=a[p]+;
flag[p-]=;
}
if(i==&&!flag[p+]&&p+<)
{
q.push(p+);
a[p+]=a[p]+;
flag[p+]=;
}
if(i==&&!flag[p*]&&p*<)
{
q.push(p*);
a[p*]=a[p]+;
flag[p*]=;
}
}
}
return a[k];
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(a,,sizeof(a));
memset(flag,,sizeof(flag));
printf("%d\n",bfs());
}
return ;
}

一定要flag数组,因为很有可能好几种走法都能到达终点,导致,终点被加了好几次。而最先走到的,肯定是最短的。还有每次走的时候都要判断有没有越界。。因为这个RE两次。

05-11 14:48