题目链接hdoj5523
一、题目分析
有n根柱子,编号为s的柱子是入口,编号为t的柱子是出口,玩家每次移动可以是走到相邻的柱子,也可以使用超能力移动到第1根柱子或者第n根柱子(始末两根柱子不相邻),要求必须经过每一根柱子才能从出口出来,并且每根柱子只能经过一次。
一个测试案例,包含三个输入的数字n、s、t(1≤N≤10000,1≤S,T≤N),要求输出超能力的最小消耗,若无法走出则输出-1。
由题意可知,最后的输出结果只能是这几种可能:-1,0,1,2。下面依次分析这几种可能:如果n==1时输出0;否则,如果s==t时输出-1;否则,如果(s==1&&t==n)或者(s==n&&t==1)时输出0;否则,如果s==1或者s==n或者abs(s-t)==1时输出1;否则输出2。
二、AC代码
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
using namespace std;
int main(){
int n,s,t;
while(~scanf("%d%d%d",&n,&s,&t)){
if(n==1)
printf("0\n");
else if(s==t)
printf("-1\n");
else if( (s==1&&t==n) || (s==n&&t==1) )
printf("0\n");
else if( s==1 || s==n || abs(s-t)==1)
printf("1\n");
else
printf("2\n");
}
return 0;
}