https://vjudge.net/contest/242868#problem/D
注意加减乘除后的数据范围,以及next的边界,注意时时要用v[ ]标记已经便遍历过的
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <queue>
using namespace std;
queue<int> q;
int sta,end;
int count=0;
int d[3][3]={1,0,0,0,1,0,0,0,1};
int c[1000010]={0},v[1000010]={0};
int now,next=0;
void bfs()
{
q.push(sta);
v[sta]=1;
while(!q.empty())
{
if(q.front()==end)
return;
now=q.front();
for(int i=0;i<3;i++)
{
next=now*2*d[i][0]+(now+1)*d[i][1]+d[i][2]*(now-1);
if(v[next]!=1&&next>=0&&next<=100000)
{
v[next]=1;
q.push(next);
c[next]=c[now]+1;
}
}
q.pop();
}
return;
}
int main()
{
while(~scanf("%d%d",&sta,&end))
{
bfs();
printf("%d\n",c[end]);
memset(v,0,sizeof(v));
memset(c,0,sizeof(c));
while(!q.empty())
q.pop();
}
return 0;
}