【C# 每日一题1】猫捉老鼠
Description
猫和老鼠在一条直线上,猫当然想抓住老鼠,而老鼠想逃回自己的家(在直线的某一点)
老鼠每次只能在直线上走一步,前进一个坐标
而猫有两种方法
1:在直线上走一步:前进一个坐标或后退一个坐标
2:往前跳一步,猫每次跳得距离等于猫当前坐标值
Input
第一行输入一个n,表示有几组测试数据
每组测试数据输入l表示老鼠的家的坐标(2<=l<=10000),x表示猫当前坐标,y表示老鼠当前坐标
Output
每组测试数据输出一个整数表示猫最少要几步才能抓住老鼠
如果猫抓不到老鼠则输出-1
你可以认为老鼠每次行动都在猫之前
Sample Input
1
100
20 88
Sample Output
6
C#区每日一题,周一至周五发表,希望大家支持
------解决方案--------------------
那么,猫在哪个时间点呢做决定是走还是跳?老鼠移动前还是移动后?
------解决方案--------------------感觉上用2进制方便点
------解决方案--------------------
int dest,beginmouse,begincat;
struct _node
{
	int catpos;
	int mousepos;
};
_node queue[10000000];
int head,tail;
int step;
int minstep;
void Run()
{
	int casenum;
	scanf("%d",&casenum);
	while(casenum--)
	{
		scanf("%d %d %d",&dest,&begincat,&beginmouse);
		head = tail = 0;
		step = -1;
		minstep = -1;
		if(begincat >= beginmouse)
		{
				if((begincat-beginmouse)%2 == 0)step = (begincat-beginmouse)/2;
		}
		else
		{
			queue[0].catpos = begincat;
			queue[0].mousepos = beginmouse;
			head = 0;tail = 1;
		}
		while(head < tail)
		{
			if(queue[head].mousepos-queue[0].mousepos >= minstep && minstep != -1)
			{
				head++;
				continue;
			}
			//分三种情况
			//1 猫后退一步
			queue[tail].mousepos = queue[head].mousepos+1;
			queue[tail].catpos = queue[head].catpos-1;
			if(queue[tail].mousepos != dest)tail++;
			//2 猫前进一步
			queue[tail].mousepos = queue[head].mousepos+1;
			queue[tail].catpos = queue[head].catpos+1;
			if(queue[tail].mousepos != dest)tail++;
			//猫前跳一步
			int curmouse = queue[tail].mousepos = queue[head].mousepos+1;
			int curcat = queue[tail].catpos = queue[head].catpos*2;
			if(curcat >= curmouse)
			{
				if((curcat-curmouse)%2 == 0 && queue[tail].mousepos+(curcat-curmouse)/2 <= dest)
				{
				//	printf("%d %d\n",queue[tail].mousepos,queue[tail].catpos);
					step = queue[tail].mousepos-queue[0].mousepos+(curcat-curmouse)/2;
					if(step < minstep 
------解决方案-------------------- minstep == -1)minstep = step;
				}
			}
			else tail++;
			head++;
		}
		printf("%d\n",minstep);
	}
}
int main()
{
	Run();
	while(1);
	return 0;
}
------解决方案--------------------时间有限只写了 
猫>鼠>家这种情况的
鼠>猫>家
猫>家>鼠
家>鼠>猫
家>猫>鼠
鼠>家>猫 都差不多
winForm 做的小动画
        private void MSGame()