比赛链接: 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;
}

                     
View Code

相关文章: