SG函数 多校Chess

题目来源

题意为:N*20的棋盘,刚开始有一些棋子在上面,棋子只能向前移动,不能向下或向上移动。如果该棋子前面有棋子,则可以跳过前面的棋子移动到下一个空位,但是并不能跳过空位,来移动到下一个空位。最后,谁不能移动棋子谁就输。

SG函数

Nim游戏

#include 
#include 
#include 
#include 
#include 
#define MAXN 200010
using namespace std;

int sg[1<<21];
int met[22];

int DFS(int temp){
    if(sg[temp] != -1){
        return sg[temp];
    }
    memset(met,0,sizeof(met));
    for(int i = 0; i < 20; i++){
        if(temp & (1<= 0; i--){
        sg[i] = DFS(i);
    }
}
int main(){
    int T;
    int n,m;
    int x,ans,sum;
    init();
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        ans = 0;
        for(int i = 0; i < n; i++){
            scanf("%d",&m);
            sum = 0;
            for(int j = 0; j < m; j++){
                scanf("%d",&x);
                sum +=(1<<(x-1));
            }
            ans ^= sg[sum];
        }
        if(ans)
        printf("YES\n");
        else{
            printf("NO\n");
        }
    }
    return 0;
}


你可能感兴趣的:(acm)