首先这个题目的要求是:找到一种监测方法,使得所有小偷移动序列中 一定会有至少 一个时间点 在 一个地点 与之重合。
这个题可不能从左往右扫一遍,因为即使只这样,小偷也会跑过去。
/*
我们先试着确定小偷的范围,将其渐渐逼死,结果很没有头绪,因为这样的小偷是"万能",即出生位置可以不断调整来始终破坏这个策略。
但这样分析是不对的,因为小偷只可能有一个出生位置。*/
解法:
从左往右扫列,再从右往左扫列。
2000步,即可抓住。
因为:
小偷之所以能“迎面逃走”,是因为小偷所在列的奇偶性和查看的列不同。
如果两者相同,绝不可能迎面逃走。
所以如果小偷出生在奇数列,你第一遍从左往右扫,那么扫到第1000列之前,一定能抓住他,因为每次都是同奇偶。
如果小偷出生在偶数列,第一次从左往右抓不到他,但是1001次,你监测1000列,你在偶数列,他也在偶数列,
现在从右往左扫,因为你们每步同奇偶,所以一定能在2000步之前抓住他。除非他每次能走2列,但那不可能,因为
那就像他长了翅膀会飞一样。
#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int n=1000 ;
int main()
{
printf("2000\n");
for(int x=1;x<=n;x++)
{
printf("%d %d %d %d\n",x,1,x,2);
}
for(int x=n;x>=1;x--)
{
printf("%d %d %d %d\n",x,1,x,2);
}
return 0;
}