题意:火车有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
", t);
}
return 0;
}