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. python爬虫-使用cookie登录

    前言: 什么是cookie? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想 ...

  2. [2017BUAA软工助教]学期总结

    一.表 学号 第0次 week1 week2 week3 个人项目 附加1 结对项目 附加2 a团队得分 a贡献分 b团队得分 b贡献分 阅读作业 提问回顾 总分1 总分2 14011100 8 8 ...

  3. 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...

  4. 《Linux内核分析》第三周:Linux系统启动过程

    杨舒雯 原创作品转载请注明出处 Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验--使用gdb跟踪调试内 ...

  5. 20135337朱荟潼 Linux第一周学习总结——计算机是如何工作的

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC-1000029000 1.冯诺依曼体系结 ...

  6. Xmind 8 pro 软件破解版

    转载地址:https://blog.csdn.net/qq_16093323/article/details/80967867 Xmind是一款非常专业的思维导图软件,收费好几百元,不过还是很多用户, ...

  7. [转帖]ESXi、Linux、Windows获取机器序列号的方法

    http://blog.51cto.com/liubin0505star/1717473 windows: wmic bios get serialnumber linux: dmidecode准确一 ...

  8. Java之JDBC操作

    下载jar包: mysql-connector-java-5.1.44.jar 导入包: import java.sql.*; 源码如下: /** * 使用JDBC底层实现查询 */ public s ...

  9. 牛客网暑期ACM多校训练营(第一场)J Different Integers

    链接:https://www.nowcoder.com/acm/contest/139/J 题意: 给你[l,r]问[1,l],[r,n]中有多少个不同的数. 思路: 可以参考上一篇博客:https: ...

  10. Java移动文件到另外一个目录

    private void moveTotherFolders(String pathName,String fileName,String ansPath){ String startPath = t ...