World of Darkraft(codeforces 138D)

题意:有一个 n × m 的棋盘,每个点上标记了 L; R; X 中的一个

每次能选择一个没有被攻击过的点 (i; j),从这个点开始发射线,射线形状为:

1. 若字符是 L,向左下角和右上角发,遇到被攻击过的点就停下来

2. 若字符是 R,向左上角和右下角发,遇到被攻击过的点就停下来

3. 若字符是 X,向左小左上右下右上发,遇到被攻击过的点停下来

问先手是否必胜, n; m ≤ 20

/*
    首先可以根据激光的性质,把图进行奇偶划分,然后就变成了两个子问题。
    当出现一道激光时,这个游戏就变成了2个或4个完全等价的游戏,可以根据这个特点设计SG函数。
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 50
using namespace std;
int n,m,dp[N][N][N][N][2];
char map[N][N];
int dfs(int min_x,int max_x,int min_y,int max_y,int op){
    int ret=dp[min_x][max_x][min_y][max_y][op];
    if(ret!=-1) return ret;
    char s[N]={0};
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if((i+j&1)==op){
                int x=i+j,y=i-j+m;
                if(x>=min_x&&x<max_x&&y>=min_y&&y<max_y){
                    int g=0;
                    if(map[i][j]==‘L‘)
                        g=dfs(min_x,x,min_y,max_y,op)^dfs(x+1,max_x,min_y,max_y,op);
                    if(map[i][j]==‘R‘)
                        g=dfs(min_x,max_x,min_y,y,op)^dfs(min_x,max_x,y+1,max_y,op);
                    if(map[i][j]==‘X‘)
                        g=dfs(min_x,x,min_y,y,op)^dfs(min_x,x,y+1,max_y,op)
                         ^dfs(x+1,max_x,min_y,y,op)^dfs(x+1,max_x,y+1,max_y,op);
                    s[g]=1;
                }
            }
    while(s[++ret]);
    dp[min_x][max_x][min_y][max_y][op]=ret;
    return ret;
}
int main(){
    memset(dp,-1,sizeof(dp));
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%s",map[i]);
    int t=dfs(0,n+m,0,n+m,0)^dfs(0,n+m,0,n+m,1);
    if(t) printf("WIN");
    else printf("LOSE");
    return 0;
}
时间: 2024-10-24 11:41:48

World of Darkraft(codeforces 138D)的相关文章

[题解]Yet Another Subarray Problem-DP 、思维(codeforces 1197D)

题目链接:https://codeforces.com/problemset/problem/1197/D 题意: 给你一个序列,求一个子序列 a[l]~a[r] 使得该子序列的 sum(l,r)-k*(r-l+1)/m(向上取整)的值是在所有子序列中最大的,并输出最大值 思路: 法一:动态规划 dp[i][j] 表示序列到i截止,这一轮已经进行了j次取数(j = (len+m-1)%m) 那么dp[i][j]维护的就是起点为 s = i-j+1-m*t (t>=0)这个集合的最优,这样所有的

AC自动机+dp(CodeForces - 86C )

"Multidimensional spaces are completely out of style these days, unlike genetics problems" — thought physicist Woll and changed his subject of study to bioinformatics. Analysing results of sequencing he faced the following problem concerning DNA

Palindrome Degree(CodeForces 7D)—— hash求回文

学了kmp之后又学了hash来搞字符串.这东西很巧妙,且听娓娓道来. 这题的题意是:一个字符串如果是回文的,那么k值加1,如果前一半的串也是回文,k值再加1,以此类推,算出其k值.打个比方abaaba,k值为3,abaxxaba,k值为1.现在,给出一个串,让你求这个串的所有前缀(包括本身)的k值的和. 如果考虑马拉车,那么先预处理出每个地方的最长回文长度,然后不断的截断,如果子串的回文长度大于其回文长度,那么k值加1,这样即可.但是马拉车写起来比较繁琐,没有模板我也没法手写. 这里提供hash

A - Playing with Paper (CodeForces - 527A)

- 题目大意 给定的矩形,每次裁剪最大的正方形,直到最后剩下正方形,总共有多少个正方形. - 解题思路 显然,每次裁剪后,原来的宽和(长-宽)变成了现在的长和宽,直到长等于宽. - 代码 #include<iostream> using namespace std; long long num(long long a, long long b) { if (b == 1) return a; if (a % b == 0) return a / b; return num(b, a % b)

「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多组数据. $n \leq 3\times 10^5, T\leq 10$ CodeForces:无多组数据,$n \leq 10^6$ [题解] 这题有点神奇啊.. 首先考虑序列全是0要怎么做. 考虑到如果两个数的位置含有的因数种类完全一样,那么它们是可以互换的.(这个挺显然的) 观察如果两个质数的

[题解]Print a 1337-string...-数学(codeforces 1202D)

题目链接:https://codeforces.com/problemset/problem/1202/D 题意: 构造一串只由 ‘1’,‘3’,‘7’ 组成的字符串,使其 ‘1337’ 子序列数量为n 思路: 构造 ‘13377733337’ 类型的字符串,使 C(2,m)+k=n k为中间 ‘7’ 的数量,C(2,m)为中间 ‘3’ 的数量 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4

Fence(codeforces 232D)

题意: 对于给定的a[1..n],定义区间[s,t]和[x,y]"匹配"当且仅当下列条件同时满足:1. t-s=y-x,即长度相同.3. t<x或s>y,即两区间没有交.2. 对任0<=i<=t-s,有a[s]+a[x]=a[s+i]+a[x+i].现给出a[1..n]和Q个询问(x,y),求与[x,y]匹配的区间的个数. /* 写了n个小时,还没有调出来,Orz... 代码量倒是不大,但是细节巨多,已经弃疗了... 先差分一下, 然后题目就变成了,也就是这段区

(CodeForces 510C) Fox And Names 拓扑排序

题目链接:http://codeforces.com/problemset/problem/510/C Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographical order.

Romaji (CodeForces - 1008A )

Vitya has just started learning Berlanese language. It is known that Berlanese uses the Latin alphabet. Vowel letters are "a", "o", "u", "i", and "e". Other letters are consonant. In Berlanese, there has t