1. 程式人生 > 實用技巧 >jzoj 6826. 【2020.10.17提高組模擬】隔膜(lcyrcx)

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;
}