C. Pie or die

C. Pie or die

题意:

两个人博弈
有一个用木棍拼成 N*M的方格
开始的时候 有 几个馅饼 在块中
小A每次可以将馅饼上下左右 移动一格asfcus
小B每次可以移除一条木棍
如果小A将馅饼移出 方格小A获胜,否则小B获胜
其中:
小A先操作
小A不将馅饼 从没有木棍的地方移出去

问题分析:

如果小A无法 移出 方格外 就表明下一步 小B一定可以 将边界堵上
但是我看方格的 四个角,他和外界 有两条变相邻,也就是说,如果小A想要
获胜(除了馅饼本身就在靠近边界的小方块里)就必须 移动到 四个角落才行

对于小B来说 如果防止 小A获胜 ,就必须 在将馅饼移动到 四个角落之前 将四个角落的 两条边界各自移除一条
换句话说 就是在小A走第五步之前 将四调边界 补好,这样当小A移动到 边界的时候
可以直接将一角的 另一边界补上就行了
这是 小A和小B最优的 操作 在这个前提下

只要馅饼的任意坐标离边界 小于等于5(等于5移动4步就行)
这样A 获胜
否则 边界封上 B获胜

AC代码:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
#define lowbit(a) ((a)&-(a))
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=1e5+10,M=1e6+10;
int main(){
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
cin.tie(0);
int n,m,k;
cin>>n>>m>>k;
int flag= 0;
for(int i=0;i<k;i++){
        int x,y;
        cin>>x>>y;
        if(x<=5||y<=5||x>n-5||y>m-5){
                flag=1;
        }  
}         
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值