jzoj 6826. 【2020.10.17提高组模拟】隔膜(lcyrcx)

Description

Input

Output

Solution

分成几种情况来讨论依次一下:
1.当找不到(k*k)的矩阵时,显然是后手赢了
2.当找到有且仅有一个(k*k)的矩阵(及不存在其他矩阵或其他矩阵都与该矩阵相交)时,先手胜
3.当找到2个或2个以上的互不相交的(k*k)的矩阵时:
因为一旦找到(k*k)的空格子便可以在任意一个空格子处放棋子,所以最后可以转换成先把两个不相交的矩形以外的点先全部取完的情况
此时因为只剩两个矩形,所以取下一步的人必输
所以对于这种情况,我们统计全图空格子的个数,判断奇偶就好(因为两个矩阵的大小必定会是偶数,不会产生影响)

Code

#include <cstdio>
#include <algorithm>
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int n,k,i,j,tmp,map[1010][1010],bz[1010][1010],cnt[1010][1010];
char p;
int main()
{
    open("lcyrcx");
    scanf("%d%d",&n,&k);
    for (i=1;i<=n;i++)
    {
        p=getchar();
        while (p!='0'&& p!='1') p=getchar();
        j=1;
        map[i][j]=p-'0';
        tmp+=map[i][j];
        while (p=='0' || p=='1') p=getchar(),map[i][++j]=p-'0',tmp+=map[i][j];
    }
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=n;j++)
        {
            cnt[i][j]=cnt[i-1][j]+cnt[i][j-1]-cnt[i-1][j-1]+map[i][j];
            bz[i][j]=bz[i-1][j]+bz[i][j-1]-bz[i-1][j-1];
            if (i>=k && j>=k)
            {
                if ((cnt[i][j]-cnt[i-k][j]-cnt[i][j-k]+cnt[i-k][j-k])!=0) continue;
                bz[i][j]++;
                if (bz[i-k][n] ||(j+k<=n &&  bz[i-1][n]-bz[i-1][j+k-1])) 
                {
                    if (tmp%2) printf("rx");else printf("yc");
                    exit(0);
                }

            }
        }
    }
    if (bz[n][n]) printf("rx");else printf("yc");
    return 0;
}
如果自己说什麽都做不到而什麽都不去做的话,那就更是什麽都做不到,什麽都不会改变,什麽都不会结束.
原文地址:https://www.cnblogs.com/Sport-river/p/13849126.html