比赛链接: http://acm.uestc.edu.cn/contest.php?cid=230
A.Police And The Thief ---UESTC 1913
简单博弈,先假设在警察先走的情况下分析,小偷先走的结果在其基础上取反面即可。我是这样做的,随便假设小偷在一个点,在这个点的四周都是必败态(警察抓不到),然后一步可以到达必败态的点都是必胜态,一次推向远处,容易发现规律: 当abs(xp-xt)%2==abs(yp-yt)%2时都是必败态,否则是必败态,这是结果已经得出。
两个特殊情况: 1.开始时两人在同一点,算YES。
2.格子为n*1或1*m形式,必然可以抓到,算YES。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <map> #include <set> #include <time.h> #include <queue> #include <cctype> #include <numeric> #include <cstdlib> #include <iomanip> #include <sstream> #define mod 1000000007 #define INT 2147483647 #define pi acos(-1.0) #define eps 1e-3 #define lll __int64 #define ll long long using namespace std; #define N 200005 int main() { int t,i; int n,m; int xp,yp,xt,yt; int flag; char ss[10]; scanf("%d",&t); while(t--) { flag = 1; scanf("%d%d",&n,&m); scanf("%d%d%d%d",&xp,&yp,&xt,&yt); scanf("%s",ss); if((n == 1 || m == 1)||(xp == xt && yp == yt)) { cout<<"YES\n"; continue; } int ka = abs(yp-yt); int kb = abs(xp-xt); if(ka%2 == kb%2) { flag = 0; } if(ss[0] == 'p') { if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } else { if(flag) cout<<"NO"<<endl; else cout<<"YES"<<endl; } } return 0; }