Output
For each case of the input output a interger, the least times you have to press the button when you on floor A,and you want to go to floor B.If you can't reach floor B,printf "-1".
Sample Input
题解 标准的BFS,只不过只能向上和向下移动。向上是当前楼层层数加上楼层的数字,向下是当前楼层层数减去楼层的数字。需要求出从当前楼层最少需要按几次键到达指定层数。加上剪枝再考虑一些细节就能AC了。 代码 #include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int main()
{
int N,A,B;
while(scanf("%d",&N))
{
if(N==0)break;
scanf("%d %d",&A,&B);
int i,j,fl[300]={0},count=0,use[300]={0};
for(i=1;i<=N;i++)scanf("%d",&fl[i]);
if(A==B)
{
printf("0\n");
continue;
}
if(A>N||B>N)
{
printf("-1\n");
continue;
}//排除特殊情况
queue<int> qu;
qu.push(A);
use[A]=1;
for(;;)//BFS
{
int l=qu.size(),next,now,flag=0;
count++;
while(l--)
{
now=qu.front();
qu.pop();
int num=0;
next=now+fl[now];//向上
if(next==B)
{
printf("%d\n",count);
flag=1;
break;
}
if(next>0&&next<=N&&use[next]==0)//剪枝
{
use[next]=1;
qu.push(next);
}
else num++;
next=now-fl[now];//向下
if(next==B)
{
printf("%d\n",count);
flag=1;
break;
}
if(next>0&&next<=N&&use[next]==0)//剪枝
{
use[next]=1;
qu.push(next);
}
else num++;
if(num==2&&qu.size()==0)//已经访问完所有可到达的楼层还是没到达指定楼层就输出-1
{
printf("-1\n");
flag=1;
break;
}
}
if(flag)break;
}
}
return 0;
}
Sample Input
5 1 5 3 3 1 2 5 0Sample Output
3
题解 标准的BFS,只不过只能向上和向下移动。向上是当前楼层层数加上楼层的数字,向下是当前楼层层数减去楼层的数字。需要求出从当前楼层最少需要按几次键到达指定层数。加上剪枝再考虑一些细节就能AC了。 代码 #include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int main()
{
int N,A,B;
while(scanf("%d",&N))
{
if(N==0)break;
scanf("%d %d",&A,&B);
int i,j,fl[300]={0},count=0,use[300]={0};
for(i=1;i<=N;i++)scanf("%d",&fl[i]);
if(A==B)
{
printf("0\n");
continue;
}
if(A>N||B>N)
{
printf("-1\n");
continue;
}//排除特殊情况
queue<int> qu;
qu.push(A);
use[A]=1;
for(;;)//BFS
{
int l=qu.size(),next,now,flag=0;
count++;
while(l--)
{
now=qu.front();
qu.pop();
int num=0;
next=now+fl[now];//向上
if(next==B)
{
printf("%d\n",count);
flag=1;
break;
}
if(next>0&&next<=N&&use[next]==0)//剪枝
{
use[next]=1;
qu.push(next);
}
else num++;
next=now-fl[now];//向下
if(next==B)
{
printf("%d\n",count);
flag=1;
break;
}
if(next>0&&next<=N&&use[next]==0)//剪枝
{
use[next]=1;
qu.push(next);
}
else num++;
if(num==2&&qu.size()==0)//已经访问完所有可到达的楼层还是没到达指定楼层就输出-1
{
printf("-1\n");
flag=1;
break;
}
}
if(flag)break;
}
}
return 0;
}