zoukankan      html  css  js  c++  java
  • hdu 1524 A Chess Game SG函数(有向无环图-拓扑图)博弈 (二维) + dfs(模板)

    题目来源:

    http://acm.hdu.edu.cn/showproblem.php?pid=1524

     分析:

    1:每个节点,都限制了步长。故我们设置二维向量, vector<int> v[Max_N]

    2: 每个节点可走的步长 已知。 同一般的 SG函数。

    代码如下:

    const int Max_N = 1005;
    int  sg[Max_N];
    vector<int>v[Max_N];
    //注意 f数组要按从小到大排序
    //SG函数要初始化为-1 对于每个集合只需初始化1遍
    //n是集合f的大小 f[i]是定义的特殊取法规则的数组
    
    int SG_dfs(int x) // x表示节点x
    {
        int i;
        if(sg[x]!=-1)
            return sg[x];
        if(v[x].size() == 0)
            return 0;
        int vis[Max_N];
        memset(vis,0,sizeof(vis));
        for(i=0;i<v[x].size();i++)
        {
            sg[v[x][i] ]=SG_dfs(v[x][i]);
            vis[sg[v[x][i]]]=1;
        }
        for(i=0;;i++)
            if(vis[i] ==0 )
                return i;
    }
    int main(){
        int n,m,num,tmp;
        while(scanf("%d",&n) != EOF){
            memset(sg,-1,sizeof(sg));  // 每次初始化一次即可
            for(int i=0; i<n; i++){
                v[i].clear();
                scanf("%d",&num);
                for(int j=0; j<num; j++){
                    scanf("%d",&tmp);
                    v[i].push_back(tmp);
                }
            }
            int u,res;
            while(scanf("%d",&m) && m){
                res = 0 ;
                while(m--){
                    scanf("%d",&u);
                    if(sg[u] == -1)
                        sg[u] = SG_dfs(u);
                    res^=sg[u];
                }
                if(res == 0)
                    puts("LOSE");
                else puts("WIN");
            }
        }
        return 0;
    }
  • 相关阅读:
    vue学习6
    vue学习5
    vue学习3
    vue学习2
    vue学习1
    idea快速查找和替换快捷键
    mysql三元表达式
    1 Java Lambda表达式forEach无法跳出循环的解决思路
    6 Mybatis Plus and 和 or,分页Page使用
    4 Mybatis Plus使用redis作为二级缓存
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3680907.html
Copyright © 2011-2022 走看看