题意:火车有n节车厢,从头到尾1到n编号,偷渡者和监管者一开始在不同的两节车厢,每一分钟,火车会处于两个不同的状态-移动或者停靠在车站,每一分钟,监管者都在移动,偷渡者可以选择移动或者不动。

控制者的移动如下:它有移动的方向,朝火车车头或者车尾,在移动中,它朝着移动的方向移动,如果到顶则换一个方向

如果火车在移动,那么偷渡者会转移到相邻的车厢或者不移动,如果火车在停靠站,那么偷渡者可以下火车,并且再次任意选择一个车厢上火车

让我们决定偷渡者的顺序:

如果两人在统一车厢,就是控制者逮捕了偷渡者,输出抓捕的时间
如果到了终点站,那么偷渡者胜利

如何选择最佳的方式,使得偷渡者胜利?

分析:我们可以贪心地选择,我们让偷渡者在下车的时候,选择的车厢是离监管者最远的,并且监管者在移动的时候,我们要尽可能地移动偷渡者,使得它不被抓。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
char op[20];
char s[205];//火车行驶序列
int main()
{
	int n, m, k;
	//偷渡者位置、监管者位置
	scanf("%d%d%d", &n, &m, &k);
	getchar();
	cin.getline(op, 15);

	int dir;
	//去头
	if (op[3] == 'h')
	{
		dir = 0;//监管者方向
	}//去尾
	else
	{
		dir = 1;
	}
	scanf("%s", s);

	//偷渡者方向
	int dir2 = m < k ? 0 : 1;
	int len = strlen(s);

	bool flag = false;
	int t = 0;//抓捕时间
	for (int i = 0; i < len; ++i)
	{		
		++t;
		//监管者的移动
		int lastk = k;
		if (dir == 0)//监管者方向
		{
			--k;
			if (k == 0) k = 2, dir = 1;
		}
		else
		{
			++k;
			if (k == n + 1) k = n - 1, dir = 0;//往车头走
		}
		//火车行驶
		if (s[i] == '0')
		{
			if (dir == 0)//监管者方向
			{
				if (m > lastk && m < n) ++m;
				else if (m < lastk && m > 1) --m;
			}
			else
			{
				if (m < lastk && m > 1) --m;
				else if (m > lastk && m < n) ++m;
			}

		}//火车到站
		else if(i != len - 1)
		{
			//*
			if (dir == 0) m = n;
			else m = 1;
		}
		//++t;
		if (m == k && i != len - 1)
		{
			flag = true;
			break;
		}
	}

	if (!flag)
	{
		puts("Stowaway");
	}
	else
	{
		printf("Controller %d\n", t);
	}


	return 0;
}