solution:

首先我们根据一条路径上不能有两个相同颜色的格子可以得出:

对于两个格子 $ (x_1 , y_1 ) $ 和 $ (x_2 , y_2 ) $ 必须满足:

$ x_1<x_2 and y_1>y_2 $

$ x_1>x_2 and y_1<y_2 $

所以我们可以据此剪枝,但直接暴搜肯定会超时,我们肯定还有技巧:

  1. 根据上面的剪枝我们发现将表格以(1,1) -> (n,n) -> (1,2) -> (2,1) -> (n,n-1) -> (n-1,n). . .的顺序枚举速度会快很多

  2. 现在,我们把初始棋盘中没有出现过的颜色称作自由颜色。如果我们有两个自由颜色: 1 和 2 .假设我们找到了一个可行的最终棋盘,然后把所有的 1 换成 2 ,所有的 2 换成 1 。容易发现得到的棋盘依然是可行的。

    我们把自由颜色排序(随便怎么排),如果我们当前没有用过第 i 个自由颜色,那么我们就不准碰第 i+1 个自由颜色。到最后计算结果的时候,如果我们用了 x 个自由颜色,而总共有 y 个自由颜色,那么这个局面对答案的贡献也就是 y 个数中去取 x 个组成有序排列的数目。

code:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
#define mod 1000000007
#define end {puts("0");return 0;} using namespace std; struct su{
int x,y;
}b[13],c[13],d[11][11]; ll ans;
int n,m,l,k,ti,top,sss;
int se[11],to[11];
int tot[11];
int P[11];
int a[10][10];
int ss[10][10];
bool s[10][10]; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} inline void add(int t,int x,int y){
d[t][++tot[t]].x=x;
d[t][tot[t]].y=y;
} inline bool check(int i,int x,int y){
for(rg j=1,p,q;j<=tot[i];++j){
p=d[i][j].x;q=d[i][j].y;
if(x>=p&&y>=q)return 0;
if(x<=p&&y<=q)return 0;
}return 1;
} inline void dfs(int t){
if(t>n*m){
ans+=P[to[0]+sss-k];
return ;
}
rg x=b[t].x,y=b[t].y;
if(s[x][y]){dfs(t+1);return ;}
for(rg i=1;i<=to[0];++i){
if(check(i,x,y)){
add(i,x,y);
ss[x][y]=i;
dfs(t+1);
--tot[i];
}
}
if(to[0]==k)return ;
add(++to[0],x,y);
ss[x][y]=to[0];
dfs(t+1);
tot[to[0]]=0;--to[0];
return ;
} inline void bfs(){
for(rg o=1,i=0,j=1;o<=l;++o){
c[o].x=((i==n)?i:++i);
c[o].y=((i>=n)?j++:j);
}
for(rg o=0,r,i,j;o<l;++o){
r=o&1?l-o/2:o/2+1;
i=c[r].x;j=c[r].y;
for(;i&&j<=m;--i,++j)
b[++top].x=i,b[top].y=j;
}
} int main(){
//freopen("board.in","r",stdin);
//freopen("board.out","w",stdout);
n=qr(),m=qr(),k=qr();
if((l=n+m-1)>k) end;
for(rg i=1;i<=n;++i)
for(rg j=1;j<=m;++j){
ti=a[i][j]=qr();
if(ti){
s[i][j]=1;
if(se[ti]){
ti=se[ti];
ss[i][j]=ti;
}
else{
ti=se[ti]=++to[0];
to[ti]=a[i][j];
ss[i][j]=ti;
}
if(!check(ti,i,j)){
puts("0");
return 0;
}
add(ti,i,j);
}
}
sss=k-to[0];P[0]=1;
for(rg i=0;i<sss;++i)
P[i+1]=P[i]*(sss-i);
if(l==k){
printf("%d\n",P[sss]);
return 0;
}
top=0; bfs(); dfs(1);
printf("%lld\n",ans%mod);
return 0;
}

CF293B 方格(带技巧的搜索)的更多相关文章

  1. 解决eclipse中自带的maven搜索不到非本地第三方包问题

     解决eclipse中自带的maven搜索不到非本地第三方包问题   版权声明:本文为博主原创文章,未经博主允许不得转载. 最近使用eclipse中的maven插件时发现,在pom.xml文件中添加第 ...

  2. Vim实用技巧系列 - 搜索

    最近发现了一个很好的VIM资源,best of vim tips, 展示了一系列很有用的vim 技巧.博主会逐个翻译介绍这些技巧. 来源: http://rayninfo.co.uk/vimtips. ...

  3. 高效上网教程---资源软件搜索技巧(搜索好用软件或者app去哪些网站)

    高效上网教程---资源软件搜索技巧(搜索好用软件或者app去哪些网站) 一.总结 一句话总结:查看下面这些网站用户推荐的 知乎:比如 小众软件 site:zhihu.com 简书:查看你需要的用户推荐 ...

  4. 为何windows自带的文件搜索这么慢,而Everything的这么快

    为何windows自带的文件搜索这么慢,而Everything的这么快 摘自:http://blog.sina.com.cn/s/blog_9f0cf4ed0102wvkq.html (2016-07 ...

  5. 开发移动端web应用, 使用手机自带键盘的搜索按钮

    很多时候在移动端的web页面中, 需要使用搜索功能, 然而页面中并没有太多的空间来放置一个像pc端上那样的搜索按钮, 这时候就需要借用手机输入法自带的搜索按钮来实现点击搜索 虽然不是什么大的功能, 但 ...

  6. 移动端 input 获取焦点后弹出带enter(类似于搜索,确定,前往)键盘,以及隐藏系统键盘

    一:调出系统带回车键的键盘 在项目中经常有输入框,当输入完成后点击确定执行相应的动作.但是有些设计没有确定或者搜索按钮,这就需要调用系统键盘,点击系统键盘的确定后执行相应动作. 但是单纯的input是 ...

  7. 【Luogu】【关卡2-9】带有技巧的搜索(2017年10月)

    任务说明:这里的搜索不仅包含了dfs和bfs,还包括剪枝.记录等技巧以加快速度. [USACO06FEB]数字三角形Backward Digit Su… 滑雪 吃奶酪 靶形数独 P1118 [USAC ...

  8. jQuery带tab切换搜索框样式代码

    效果体验:http://hovertree.com/texiao/jquery/23/ 代码如下,保存到HTML文件也可以查看效果: <!DOCTYPE html> <html la ...

  9. Docker安装带中文全文搜索插件zhparser的Postgresql数据库

    上一篇讲了在已经安装了PG数据库的情况下,安装全文搜索插件zhparser遇到的问题.在一个全新的环境中安装带有全文搜索插件zhparser的PG数据库,可以使用已经做好的Docker镜像,在安装的过 ...

随机推荐

  1. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

  2. 实训一(cocos2d-x相关)

    实训内容简介: 大四开始前系里安排的的集中实践环节,根据要求,开发app应用软件. 目标app:Stick_mxj 目的:继续对cocos2d-x的学习,完成实践环节,解决现在对引擎不是很清楚的一些问 ...

  3. 作业六:小学生四则运算之NABCD模型与产品Backlog。

    NABCD模型与产品Backlog NABCD模型 ) N (Need 需求) 方便了老师和学生,使他们可以想要的时候随时可以得到,省时省力,快速出题,马上得到答案. ) A (Approach 做法 ...

  4. VS2013的安装与测试

    第一步:下载完成之后点击安装,在安装过程中会出现很多选择,选择社区版(c++),安装完成: 第二步:安装完成之后打开VS2013,如图所示:   第三步:按以下步骤进行 第四步:点击[OK]之后 第五 ...

  5. ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误

    ElasticSearch 2 (26) - 语言处理系列之打字或拼写错误 摘要 我们喜欢在对结构化数据(如:日期和价格)做查询时,结果只返回那些能精确匹配的文档.但是,好的全文搜索不应该有这样的限制 ...

  6. 从零开始学Kotlin-操作符(3)

    从零开始学Kotlin基础篇系列文章 冒号操作符 ":" 和 "::" :操作符用来定义变量.类的继承等 var name: String//定义变量 clas ...

  7. mybatis 传递参数的两种方式与模糊匹配 很重要

  8. Eclipse Job

    Job可以我们基于Eclipse的Java程序中,我们有很多种方式提供多任务的实现.熟悉Java的朋友立即会想到Java的Thread类,这是Java中使 用最多的一个实现多任务的类.Eclipse平 ...

  9. gitlab迁移

    1.背景: 操作系统:CentOS Linux release (Core) gitlab版本: 使用rpm包地址:https://mirrors.tuna.tsinghua.edu.cn/gitla ...

  10. Tour HDU - 3488(最大权值匹配)

    Tour In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one- ...