博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Day1-T4
阅读量:5329 次
发布时间:2019-06-14

本文共 1838 字,大约阅读时间需要 6 分钟。

  Describe:注意是“两次及以上”而不是“两种及以上”!!

  code

#include
using namespace std;int k,m,n,ans;int f[1005][1005],cnt[20],a[1005][1005];inline int read(){ int ret=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();} while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar(); return ret*f;}inline int lowbit(int x){ return (-x)&x;}inline void write(int x){ if(x<0){putchar('-');write(-x);return;} if(x/10)write(x/10); putchar(x%10+'0');}inline int search(int x,int y){ if(x==n&&y==m+1)return 1; //Finish the search if(y==m+1)y=1,x++; //下一行 int Sum=f[x-1][y]|f[x][y-1],pr=-1,sum=0,ans=0; //Sum=当前方格上面及左边共被使用多少个颜色 for(int i=Sum;i>0;i-=lowbit(i))sum++; //统计当前状态下有多少个颜色已被使用 if(n+m-x-y-1>k-sum)return 0; //剪枝,若剩余方格少于剩余颜色 for(int i=1;i<=k;i++){ //枚举状态 if((1<<(i-1))&Sum)continue; //已被使用 if(!a[x][y]||a[x][y]==i){ //未被涂色或已涂颜色未被使用 f[x][y]=Sum|(1<<(i-1)); //涂成当前颜色,加入状态 if(!cnt[i]){ //------------DFS模板--------------- cnt[i]++; if(pr==-1)pr=search(x,y+1); ans+=pr; } else cnt[i]++,ans+=search(x,y+1); ans%=1000000007;cnt[i]--; } } return ans;}int main(){ freopen("paths.in","r",stdin); freopen("paths.out","w",stdout); n=read(),m=read(),k=read(); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)a[i][j]=read(),cnt[a[i][j]]++; ans=search(1,1);write(ans);}

 

  

 

转载于:https://www.cnblogs.com/sroht/p/9873118.html

你可能感兴趣的文章
HDU-1150 Machine Schedule 二分图匹配
查看>>
单例模式的5种写法
查看>>
安卓问题报告小记(四):Some projects cannot be imported because they already exist in the workspace...
查看>>
显示地图
查看>>
无线通信基础(一):无线网络演进
查看>>
VC++ 6.0 快捷键
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
一:MySQL数据库的性能的影响分析及其优化
查看>>
java之数组
查看>>
Linux内核分析——第四周学习笔记
查看>>
impress.js学习总结
查看>>
C语言练习:第二大整数
查看>>
自动布局之autoresizingMask
查看>>
Android获取系统ID(com.android.internal.R)
查看>>
应用安全-软件安全-漏洞CVE整理
查看>>
团队项目——测试心得
查看>>
state 全局值 设置 和获取
查看>>
Javascript面向对象编程与继承机制的设计思想(转)
查看>>
robotframe处理日志中文问题
查看>>
php多进程结合Linux利器split命令实现把大文件分批高效处理
查看>>