• Distinct Paths


    代码

    #include<cstdio>
    using namespace std;
    
    const int N = 20 , mod = 1e9 + 7 , K = 10;
    int f[N + 5][N + 5] , map[N + 5][N + 5] , vis[K + 5] , n , m , k;
    
    inline int dfs(int x , int y)
    {
    	if (y == m + 1) return dfs(x + 1 , 1);
    	if (x == n + 1) return 1;
    	
    	f[x][y] = f[x - 1][y] | f[x][y - 1];
    	int num = 0 , sum = 0 , res = 0 , bz = 0;
    	
    	for(register int i = 1; i <= k; i++)
    	if (!(f[x][y] & (1 << i - 1))) num++;
    	if (num < n + m - x - y + 1) return 0;
    	
    	if (!map[x][y])
    	{
    		for(register int i = 1; i <= k; i++)
    		if (!(f[x][y] & (1 << i - 1)))
    		{
    			if (!vis[i])
    			{
    				if (bz == 1) 
    				{
    					res = (res + sum) % mod;
    					continue;
    				}
    				else 
    				{
    					bz = 1;
    					vis[i]++;
    					f[x][y] |= 1 << i - 1;
    					sum = dfs(x , y + 1);
    					res = (res + sum) % mod;
    					f[x][y] ^= 1 << i - 1;
    					vis[i]--;
    				}
    				continue;
    			}
    			vis[i]++;
    			f[x][y] |= 1 << i - 1;
    			res = (res + dfs(x , y + 1)) % mod;
    			f[x][y] ^= 1 << i - 1;
    			vis[i]--;
    		}
    	}
    	else if (!(f[x][y] & (1 << map[x][y] - 1)))
    	{
    		f[x][y] |= 1 << map[x][y] - 1;
    		res = (res + dfs(x , y + 1)) % mod;
    		f[x][y] ^= 1 << map[x][y] - 1;
    	}
    	return res;
    }
    
    int main()
    {
    	scanf("%d%d%d" , &n , &m , &k);
    	if (n + m - 1 > k) 
    	{
    		printf("0");
    		return 0;
    	}
    	for(register int i = 1; i <= n; i++)
    		for(register int j = 1; j <= m; j++)
    		{
    			scanf("%d" , &map[i][j]);
    			vis[map[i][j]]++;
    		}
    	printf("%d" , dfs(1 , 1));
    }
    
  • 相关阅读:
    设计模式之单例模式
    Java反射之调用内部类
    Java反射之修改常量值
    myBatis之入门示例
    eclipse创建maven工程
    java核心卷轴之集合
    java核心卷轴之泛型程序设计
    sublime常用快捷键
    sublime使用package control安装插件
    sublime使用技巧之添加到右键菜单、集成VI
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/12337031.html
Copyright © 2020-2023  润新知