用start点和finish点把整个区间分成三部分
start左边部分
finish右边部分
两者之间部分
然后对三部分中叶子数量讨论一下即可
易知 start左边部分、finish右边部分的叶子数量多少只需要0或1个连续不步就可以走完,关键是中间部分计算清楚就好
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
int n,st,ed;
int main()
{
cin>>n>>st>>ed;
if (n==1) {cout<<"0"<<endl;return 0;}
if(st>ed)
{
int tmp=st;
st=ed;
ed=tmp;
}
else
if (st==ed)
{
{cout<<"-1"<<endl;return 0;}
}
int cun=0;
int t1=st-1;
int t2=ed-st-1;
int t3=n-ed;
if (t1!=0)
{
if (t2==0)
{
if (t3==0)
{
printf("1\n");
return 0;
}
else
if (t3!=0)
{
printf("-1\n");
return 0;
}
}
else
if (t2!=0)
{
if (t3==0)
{
int tmp=t2-1;
int cun_ans=tmp/3;
int tmp_ans=0;
if (tmp%3==1)
tmp_ans=2;
if (tmp%3==2||tmp%3==0)
tmp_ans=1;
printf("%d\n",1+cun_ans+tmp_ans);
return 0;
}
else
if (t3!=0)
{
int tmp=t2-1-1; //相当于计算到 k前面一个 位置的 步数
int cun_ans=tmp/3;
int tmp_ans=0;
if (tmp%3==1)
tmp_ans=2;
if (tmp%3==2||tmp%3==0)
tmp_ans=1;
int have=cun_ans+tmp_ans;
printf("%d\n",1+have+1);
return 0;
}
}
}
if (t1==0)
{
if (t2==0)
{
if (t3==0||t3!=0)
{
printf("%d\n",1);
return 0;
}
}
else
if (t2!=0)
{
if (t3==0)
{
int tmp=t2;
int cun_ans=tmp/3;
int tmp_ans=0;
if (tmp%3==1)
tmp_ans=2;
if (tmp%3==2||tmp%3==0)
tmp_ans=1;
printf("%d\n",cun_ans+tmp_ans);
return 0;
}
else
if (t3!=0)
{
int tmp=t2-1;
int cun_ans=tmp/3;
int tmp_ans=0;
if (tmp%3==1)
tmp_ans=2;
if (tmp%3==2||tmp%3==0)
tmp_ans=1;
printf("%d\n",cun_ans+tmp_ans+1);
return 0;
}
}
}
return 0;
}