题目描述
在二维坐标平面里有 N 个整数点,信息班某一巨佬要访问这 N 个点。刚开始巨佬在点(0,0)处。 每一步,巨佬可以走到上、下、左、右四个点。即假设巨佬当前所在点的坐标是(x,y),那么它下一步可以移动到(x,y+1), (x,y-1), (x+1,y),(x-1,y)之一。
巨佬目标是找到一个移动序列,满足下面的条件:
1、从点(0,0)出发。
2、对于给定的那 N 个点,每个点至少被访问一次。
3、可以选择那 N 个给定点中任意一个作为结束点。
现在为了增加难度,巨佬的教练规定巨佬走过的所有步数之和的奇偶性必须为wantedParity,显然 wantedParity 是 0 或 1,是题目给定的, 0 表示偶, 1 表示奇。不过这依然难不到巨佬,但是............
巨佬临时有事,但是 ta 又不想受教练的批评,所以巨佬向你发出了求助(并且你不可拒绝)如果存在满足条件的移动序列,那么输出 CAN,否则输出 CANNOT。
多组测试数据。
第一行,一个整数 g,表示有 g 组测试数据,1 <= g <= 50。
输入格式
第 1 行,N、wantedParity。 1 <= N <= 3000。
接下来有 N 行,每行两个整数:x, y,表示第 i 个点的坐标值。
范围都在【-1000000,1000000】。输入的 N 个点不会有重叠,且不会有(0,
0)点。
输出格式
共 g 行,每行输出 CAN 或 CANNOT。
样例输入
5
40
-1 -1
-1 1
11
1 -1
31
-5 2
-3 0
23
21
1001 0
-4000 0
30
11 -20
21 42
07
21
0 10
6 -20
样例输出
CAN
CAN
CAN
CANNOT
CANNOT
Solution:
这个题目一眼看上去很吊,还被大佬们故意放在最后一题,但是细想还是不难的。
首先我们可以发现,一个点到另一个点的路径的奇偶性是不变的,如果不知道为什么的话,有一个快速的方法:如果它的奇偶性是可以改变的,那么答案肯定是CAN,因为只要任意改变一条路径的奇偶性就可以改变整条路的奇偶性,所以不会出现CANNOT的情况,这样一想,两点之间的路径的奇偶性一定是不会改变的。
想到这一点,这个题目就很好做了,起点是(0,0),终点是n个点中任意一个,而两点之间路径的奇偶性又是确定的,所以判断(0,0)和n个点中每个点的距离的奇偶性,就可以知道有没有一条在n个点中结束的路径的长度的奇偶性与给出的wantedParity相同,然后这就是一个大水题了
贴代码:
#include<bits/stdc++.h> using namespace std; int main() { int T; bool flag; cin>>T; for(int i=1;i<=T;i++) { flag=0; int n,k; cin>>n>>k; for(int j=1;j<=n;j++) { int x,y; scanf("%d%d",&x,&y); if(flag==0) if((abs(x)+abs(y))%2==k) {flag=1; cout<<"CAN"<<endl;} } if(flag==0) cout<<"CANNOT"<<endl; } return 0; }