Codeforces 283B Distinct Paths (dfs+剪枝)
2016-03-22 22:35
399 查看
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <map> #include <vector> using namespace std; #define N 20 #define M 400030 #define mod 1000000007 #define B 234324 #define LL long long int n, m, k; int a ; int f ; int ans; int getSta(int x, int y, int s) { for(int i = x; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if((i == x && j < y)) continue; if(a[i][j] == -1) continue; s |= 1 << a[i][j]; } } return s; } bool check(int v, int x, int y) { for(int i = x; i <= n; ++i) { for(int j = y; j <= m; ++j) { if(i == x && j == y) continue; if(a[i][j] == v) return 0; } } return 1; } int count1(int s) { int ret = 0; while(s) { ret++; s -= s & -s; } return ret; } int dfs(int x, int y, int s) { if(x == n + 1) { return 1; } int dx = x, dy = y; ++dy; if(dy > m) dx++, dy = 1; int t = f[x-1][y] | f[x][y-1]; if(a[x][y] != -1) { int v = a[x][y]; if(t >> v & 1) return 0; f[x][y] = t | (1 << v); if(check(v, x, y)) { return dfs(dx, dy, s | (1 << v)); } else return 0; } else { int ret = 0; int w = 0; int z = getSta(dx, dy, s); while(z >> w & 1) ++w; f[x][y] = t | (1 << w); if(k != count1(z)) ret = 1LL * (k - count1(z)) * dfs(dx, dy, z | (1 << w)) % mod; for(int i = 0; i < k; ++i) { if(z >> i & 1 ^ 1) continue; if(t >> i & 1) continue; f[x][y] = t | (1 << i); if(check(i, x, y))ret += dfs(dx, dy, s | (1 << i)); if(ret >= mod) ret -= mod; } return ret; } } int main() { scanf("%d%d%d", &n, &m, &k); if(n + m - 1 > k) { puts("0"); return 0; } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { scanf("%d", &a[i][j]); --a[i][j]; } } ans = dfs(1, 1, 0); printf("%d\n", ans); return 0; }
相关文章推荐
- 选择排序法C语言编程
- public private protected继承后派生类成员变量的属性
- Think\Model:*方法不存在的解决方法
- Css笔记
- Laravel 数据库
- 作业4 结对编程 词频统计
- Oracle常用查询命令
- 【杭电】[4500]小Q系列故事——屌丝的逆袭
- [HashMap]——逻辑梳理
- poj Number Sequence 1019 (打表 &模拟)
- double links....baoyuzuoye
- html 标签
- HDU4781(2013成都站A题)
- 我是java小白
- NGUI之UISprite
- 如何查看,关闭和开启selinux
- 增量模型与快速模型的异同。
- mac 安装php7
- HDU 1061 Rightmost Digit --- 快速幂取模
- C#泛型学习(一)。