题意:警察抓小偷,有2行1000列个街区,警察总部要抓到这个小偷,小偷个小时都要换一个位置,换位是根据除了上下之外其他的六个方向中的一个行走,由于只有两行,所以小偷只能走他的左右位置和斜角位置,每个小时可以派两个队伍去抓捕其中两个位置的街区,问在2500个小时内能一定能抓到小偷的时间和两个队伍警察的坐标位置、
没有输入,只有输出、
思路:按照正常的思想来说,一定是两个队伍的警察是按照列来找的,必须将每一个位置都要找到,最后一定能找到小偷、 那么既然是这样的话,只需要将1 1 1 2一直到最后的位置依次便利一遍便可、 这个思路是对的,但是有一种情况没有考虑到,那就是警察在1 1 1 2 的位置,小偷在2 1 2 2 的位置,当警察继续向下遍历查找是警察应该走到2 1 2 2 的位置,而此时小偷如果走到1 1 1 2的位置的时候警察就算遍历了所有的位置也是不可能抓到小偷的,在1000个小时内一定是抓不到小偷的,这就不符合题意一定抓到小偷的条件、对于这种情况,我们只需要再从尾依次便利到头,就说明一定可以抓到小偷,为什么呢? 举个例子,如果警察在1 1 1 2 小偷在2 1 2 2 警察下一个小时警察走到2 1 2 2 小偷走到1 1 1 2的位置时,警察再从2 1 2 2的位置开始查找,那么此时小偷一定是逃不掉的,因为他是必须走的,所以警察一定会抓到小偷,所以,小偷每走一次横坐标的奇偶性是会改变的、从1遍历所有的位置为偶数1000、小偷有可能跑掉,那么再从1000从新开始遍历的时候,便为积数路,小偷一定是不可能逃掉的 ! 所以最后的抓到的时间一定是2000、直接输出路径便可、
无论是从头开始找,还是从尾开始找,都是可以的,因为那样一定能抓到小偷、
AC代码:
从头开始遍历
#include<cstdio>
int main()
{
printf("2000\n");
for(int i=1;i<=1000;i++)
printf("%d 1 %d 2\n",i,i);
for(int i=1000;i>=1;i--)
printf("%d 1 %d 2\n",i,i);
return 0;
}
从尾开始遍历
<pre name="code" class="cpp">#include<cstdio>
int main()
{
printf("2000\n");
for(int i=1000;i>=1;i--)
printf("%d 1 %d 2\n",i,i);
for(int i=1;i<=1000;i++)
printf("%d 1 %d 2\n",i,i);
return 0;
}