zoukankan      html  css  js  c++  java
  • 郑厂长系列故事——N骑士问题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 1<<8
    #define max(x,y) x > y ? x : y 
    #define J(u,d,k) !((u>>k)&d) && !((u<<k)&d) 
    
    int n, num[MAXN], ins[9] ;
    int dp[9][11][MAXN][MAXN] ;
    int s[9][MAXN] ;
    
    void getTable()
    {
        int i, j, k ;
        for(i = 1 ; i <= 8 ; i ++)
        {
            for(k = j = 0 ; j < MAXN ; j ++)
                if(!(j&ins[i]) ) s[i][++k] = j ;
            s[i][0] = k ;
        }
    }
    int stateDP()
    {
        int i, j, k, l, x, y ; 
        int ans = 0 ;
        memset(dp, 0, sizeof(dp)) ;
        for(i = 1 ; i <= s[1][0] ; i ++)
            for(j = 1 ; j <= s[2][0] ; j ++) 
                if(J(s[1][i], s[2][j], 2)) dp[2][ num[s[1][i]]+num[s[2][j]] ][i][j] = 1 ;
        for(i = 3 ; i <= 8 ; i ++)
        {
            for(j = 1 ; j <= s[i-1][0] ; j ++)
                for(k = 1 ; k <= s[i][0] ; k ++) 
                {
                    if(!J(s[i-1][j], s[i][k], 2)) continue ;
                    x = num[s[i-1][j]] + num[s[i][k]] ;//
                    for( ; x <= n ; x ++ ) 
                    {
                        for(l = 1 ; l <= s[i-2][0] ; l ++)
                            if(J(s[i-2][l], s[i][k], 1) && J(s[i-2][l], s[i-1][j], 2))
                            {
                                dp[i][x][j][k] += dp[i-1][ x-num[s[i][k]] ][l][j] ;
                            }
                    }
                }
        }
        for(i = 1 ; i <= s[7][0] ; i ++)
            for(j = 1 ; j <= s[8][0] ; j ++)
                if(J(s[7][i], s[8][j], 2))ans += dp[8][n][i][j] ;
        return ans ;
    }
    
    int main()
    {
        int i, j, T ;
        char str[10] ;
        for(i = 0 ; i < MAXN ; i ++)
            for(num[i] = j = 0 ; j < 8 ; j ++) num[i] = i&(1<<j) ? num[i]+1 : num[i] ;
        scanf("%d", &T) ;
        while(T --)
        {
            scanf("%d", &n) ;
            for(i = 1 ; i <= 8 ; i ++)
            {
                scanf("%s", str) ;
                for(ins[i] = j = 0 ; j < 8 ; j ++) ins[i] = (str[j] == '*') ? ins[i]+(1<<j) : ins[i] ;
            }
            getTable() ;
            printf("%d\n", stateDP()) ;
        }
        return 0 ;
    }
  • 相关阅读:
    leetcode Reverse Words in a String
    leetcode[150] Evaluate Reverse Polish Notation
    leetcode Max Points on a Line
    leetcode Sort List
    leetcode Insertion Sort List
    vs 中一些快捷键
    leetcode LRU Cache
    leetcode[145] Binary Tree Postorder Traversal
    leetcode Binary Tree Preorder Traversal
    Leetcode Reorder List
  • 原文地址:https://www.cnblogs.com/xieyue/p/2991983.html
Copyright © 2011-2022 走看看