题面

题目链接

洛谷链接

Codeforces链接

题意翻译

【问题描述】

给定一个 $ n*m $ 的矩形色板,有 $ k $ 种不同的颜料,有些格子已经填上了某种颜色,现在 需要将其他格子也填上颜色,使得从左上角到右下角的任意路径经过的格子都不会出现两种 及以上相同的颜色。路径只能沿着相邻的格子,且只能向下或者向右。 计算所有可能的方案,结果对 $ 1000000007 (10^9 + 7) $ 求模。

【输入数据】

第一行,三个整数 $ n, m, k (1 \leq n, m \leq 1000, 1 \leq k \leq 10) $ ; 接下来 $ n $ 行,每行包含 $ m $ 个整数,表示颜色。其中 $ 0 $ 表示未涂色,非 $ 0 $ 表示颜色的编号, 颜色编号为 $ 1 $ 到 $ k $ 。

【输出数据】

一行,一个整数,表示涂色方案对 $ 1000000007 (10^9 + 7) $ 求模的结果

输入输出样例

输入样例#1

2 2 4
0 0
0 0

输出样例#1

48

输入样例#2

2 2 4
1 2
2 1

输出样例#2

0

输入样例#3

5 6 10
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

输出样例#3

3628800

输入样例#4

2 6 10
1 2 3 4 5 6
0 0 0 0 0 0

输出样例#4

4096

说明

【时空限制】

2000ms,256MB

思路

首先题目是吓人的。n+m-1>k的时候显然是无解的。那么输出0。

那么范围就缩小很多了。

然后就没有别的办法了。搜索吧

但是可以加这样两个剪枝

1.在填某一个格子时,如果某些颜色在之前没有使用过,那么他们的情况数都是相同的

2.如果剩余颜色不能支撑你走到终点,那就直接返回0

另外,记录颜色可以用状压

AC代码

#include<bits/stdc++.h>
const int mod=1e9+7;
const int maxn=12;
using namespace std; int n,m,k;
int MAP[maxn][maxn],use[maxn];
int Board[maxn][maxn]; int Num(int x)
{
int ans=0;
while(x) x-=x&(-x),ans++;
return ans;
} int dfs(int x,int y)
{
if(y==m+1) x++,y=1;
if(x==n+1) return 1;
int now=(Board[x-1][y]|Board[x][y-1]),kind=-1;
int ans=0;
if(n-x+m-y+1+Num(now)>k) return 0;
for(int i=1;i<=k;i++)
{
if((1<<(i-1))&now) continue;
if(MAP[x][y] && MAP[x][y]!=i) continue;
Board[x][y]=((1<<(i-1))|now);
use[i]++;
if(use[i]==1)
{
if(kind==-1) kind=dfs(x,y+1);
ans+=kind;
}
else ans+=dfs(x,y+1);
ans%=mod;
use[i]--;
}
return ans;
} int main()
{
scanf("%d%d%d",&n,&m,&k);
if(n+m-1>k)
{
printf("0");
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&MAP[i][j]);
use[MAP[i][j]]++;
}
printf("%d",dfs(1,1));
return 0;
}

总结

没想到纯搜索题也能出这么难。。以后还要多练啊

Codeforces 293B Distinct Paths DFS+剪枝+状压的更多相关文章

  1. UVA 10318 Security Panel(DFS剪枝 + 状压 + 思维)题解

    题意:给一个r*c的矩阵开关(初始全打开的),每次按下一个开关都会改变3*3范围内的有*的地方的状态,问你最少几步能让开关全闭上,按升序输出按哪些按钮 思路:每个按钮至多按一下,按按钮的顺序和结果无关 ...

  2. [Codeforces 163D]Large Refrigerator (DFS+剪枝)

    [Codeforces 163D]Large Refrigerator (DFS+剪枝) 题面 已知一个长方体的体积为V,三边长a,b,c均为正整数,求长方体的最小表面积S V以质因数分解的形式给出 ...

  3. Codeforces Gym 100015F Fighting for Triangles 状压DP

    Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...

  4. Codeforces Round #384 (Div. 2) //复习状压... 罚时爆炸 BOOM _DONE

    不想欠题了..... 多打打CF才知道自己智商不足啊... A. Vladik and flights 给你一个01串  相同之间随便飞 没有费用 不同的飞需要费用为  abs i-j 真是题意杀啊, ...

  5. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  6. Coco dfs 或者 状压dp。...

    C -- Coco Time Limit:1s Memory Limit:64MByte Submissions:148Solved:85 DESCRIPTION Coco just learned ...

  7. Codeforces 375C - Circling Round Treasures(状压 dp+最短路转移)

    题面传送门 注意到这题中宝藏 \(+\) 炸弹个数最多只有 \(8\) 个,故考虑状压,设 \(dp[x][y][S]\) 表示当前坐标为 \((x,y)\),有且仅有 \(S\) 当中的物品被包围在 ...

  8. Codeforces Beta Round #16 E. Fish (状压dp)(概率dp)

    Codeforces Beta Round #16 (Div. 2 Only) E. Fish 题目链接:## 点击打开链接 题意: 有 \(n\) 条鱼,每两条鱼相遇都会有其中一只吃掉对方,现在给你 ...

  9. codeforces gym #101161H - Witcher Potion(状压DP)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 总共有n瓶药可供选择 每瓶药可以增加$e_i$点体力,和$p_i$点毒性 每分钟消耗1点毒 ...

随机推荐

  1. Android 开发 AudioRecord音频录制

    前言 Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风录入的音频数据进行编码压 ...

  2. DFS-深度优先搜索与BFS-广度优先搜索

    1.DFS DFS是一个递归过程.(类似于二叉树的前序遍历) 参考:深度优先搜索(Depth-First-Search)精髓 2.BFS 可以理解为按层遍历,借助队列结构来实现.(类似于二叉树的层次遍 ...

  3. 装配SpringBean(四)--注解装配之组件扫描

    前两篇文章我总结了通过XML方式装配bean的实现方式,虽然比较简单,但是需要配置很多,很多时候我们都会使用注解进行装配.使用注解的方式可以减少XML的配置,既能实现XML的功能,还提供了自动装配功能 ...

  4. select2下拉内容获取后台数据

    controller(id给select:text给另外的input框) @RequestMapping(value = "findUnit")public @ResponseBo ...

  5. 2019-9-2-win10-uwp-截图-获取屏幕显示界面保存图片

    title author date CreateTime categories win10 uwp 截图 获取屏幕显示界面保存图片 lindexi 2019-09-02 12:57:38 +0800 ...

  6. jmeter断言步骤

    在POST /wordpress/wp-login.php请求,也就是名称为submit login form user的请求上点右键, 选择添加 -> 后置处理器 -> CSS/JQue ...

  7. there is no permission with id `12`

    Laravel 本地环境添加菜单之后, 线上报错, 线上线上用同一个数据库, 原因是缓存问题, 解决方法: php artisan cache:clear 如果缓存有重要数据的, 那就要清除对应的缓存 ...

  8. 03Redis入门指南笔记(事务、生存时间、排序、消息通知、管道)

    一:事务 1:概述 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行. 事务的原理是是先将属于一个事务 ...

  9. ThinkPHP中实现微信支付(jsapi支付)流程

    https://blog.csdn.net/sinat_35861727/article/details/72783988 之前写过一篇文章讲了 PHP实现微信支付(jsapi支付)流程 ,详见文章: ...

  10. HDU4578 Transformation (多操作线段树)

    传送门 终于过了这道题.. 要注意标记之间的影响,和add操作时更新求和的顺序. same 区间每个数设置为x标记 mult  区间每个数乘x标记 add  区间每个数加x标记 ①:当打same标记时 ...