头一次独自完成插头DP的题,发博客庆祝一下。

(不过我居然因为忘记取模错了一次)

发现n,m都很小,可以用插头DP。

可以把点看作格子。

用一个变量zt来记录当前位置在回路内部还是外部,便于思考。如果格子左边有一个横向的插头,那么用它左上角判断位置。不过这个不影响答案。

具体细节看代码。

    #include<cstdio>#include<iostream>using namespace std;const int md=123456791;int n,m;char s[40][20];struct node{int val,zt;}q1[1<<15],q2[1<<15];int dp1[1<<15],dp2[1<<15];node *p=q1,*q=q2;int *dp=dp1,*dq=dp2;int num1,num2;int a[40];void printa(){for(int i=0;i<=m;i++)printf("%d",a[i]);printf("\n");}void turn_out(int val){for(int i=0;i<=m;i++){a[i]=val&1;val>>=1;}} int turn_in(){int val=0;for(int i=m;i>=0;i--){val<<=1;val+=a[i];}return val;}void shift(){for(int i=m;i>=1;i--)a[i]=a[i-1];a[0]=0;}void push_in(node st,int val){ if(!dq[st.val]) q[++num2]=st;(dq[st.val]+=dp[val])%=md;}void dp_block(int k,node st){turn_out(st.val);if(k==1) shift();int val,zt;if(a[k-1]&&a[k]){a[k-1]=0,a[k]=0;val=turn_in(),zt=st.zt^1;push_in((node){val,zt},st.val);return;}else if(a[k-1]&&!a[k]){if(k<m){a[k-1]=0,a[k]=1;val=turn_in(),zt=st.zt;push_in((node){val,zt},st.val);}a[k-1]=1,a[k]=0;val=turn_in(),zt=st.zt;push_in((node){val,zt},st.val);return;}else if(!a[k-1]&&a[k]){a[k-1]=1,a[k]=0;val=turn_in(),zt=st.zt^1;push_in((node){val,zt},st.val);if(k<m){a[k-1]=0,a[k]=1;val=turn_in(),zt=st.zt^1;push_in((node){val,zt},st.val);}return;}else if(!a[k-1]&&!a[k]){if(k<m){a[k-1]=1,a[k]=1;val=turn_in(),zt=st.zt;push_in((node){val,zt},st.val);}return;}}void dp_in(int k,node st){turn_out(st.val);if(k==1) shift();int val,zt;if(!a[k-1]&&!a[k]&&st.zt==1){val=turn_in(),zt=st.zt;push_in((node){val,zt},st.val);}}void dp_out(int k,node st){turn_out(st.val);if(k==1) shift();int val,zt;if(!a[k-1]&&!a[k]&&st.zt==0){val=turn_in(),zt=st.zt;push_in((node){val,zt},st.val);}}int main(){//  freopen("A1223.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%s",s[i]+1);num1=1,num2=0;p[num1]=(node){0,0};dp[0]=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=1;k<=num1;k++){if(s[i][j]=='.') dp_block(j,p[k]);else if(s[i][j]=='*') dp_in(j,p[k]);else if(s[i][j]=='#') dp_out(j,p[k]);dp[p[k].val]=0;}swap(dp,dq);swap(p,q);num1=num2,num2=0;}}printf("%d\n",dp[0]);return 0;}

清澄A1223. 画圈圈(范浩强)相关推荐

  1. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  2. 《C语言程序设计》(谭浩强第五版) 第2章 算法——程序的灵魂

    <C语言程序设计>(谭浩强第五版) 第2章 算法--程序的灵魂 习题解析与答案 你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解 ...

  3. C语言程序设计第五版 谭浩强 第四章 课后习题 答案

    谭浩强C语言程序设计第五版 第4章 课后习题 答案 点我看视频讲解+可运行源码 记得一键三连哦 第四章 选择结构程序设计 1. 什么是算术运算?什么是关系运算?什么是逻辑运算? [答案解析] 算熟运算 ...

  4. 漫画:狼厂校招面试题(面试官说要和我画圈圈...)

    今天是小浩算法"365刷题计划"第78天.这次小浩又出去面试了,面试官说想和我画圈圈(原题为狼厂校招面试题),想起来还有点羞羞的. 01 PART 画圈圈 !@#¥%--& ...

  5. 谭浩强《C++程序设计》书后习题 第十三章-第十四章

    2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的<C程序设计>和<C++程序设计>习题 ...

  6. 谭浩强《C++程序设计》学习

    谭浩强<C++程序设计>学习 zdh1995 2017-10-12 15:54:56  5613  收藏 251 文章标签: c++ 版权 C++ 不要把面向对象和基于过程对立起来,面向对 ...

  7. 谭浩强c语言第六章兔子数列,谭浩强 C语言 第6章_循环.ppt

    谭浩强 C语言 第6章_循环 第六章 本章要点 循环的基本概念 不同形式的循环控制 多重循环问题 主要内容 6.1 概述 6.2 goto语句以及用goto语句构成循环 6.3 用while语句实现循 ...

  8. 学习谭浩强老师的《C程序设计》,必配《C程序设计伴侣》!

    <C程序设计伴侣>作者陈良乔:"更有趣.更容易.更深刻.更实战的<C程序设计伴侣>--<C程序设计>的有力补充和最佳伴侣.在中国,几乎每一个人,第一次接触 ...

  9. c++程序设计梳理(谭浩强)3-4章

    为什么80%的码农都做不了架构师?>>>    同学拿了58的offer,22万一年,内心多少有点不是滋味.自己享受着这么丁点的中兴薪酬,明显是学业不精的那一类.事实确实如此,可当现 ...

  10. 转:中国学生为什么学不好计算机 谭浩强

    谭浩强教授是国内知名的计算机教育推进者,同时他也是国内知名的计算机教材编写者.谭教授所著<Basic语言教程>一书的销量达到了一千两百万,创下了同类教材销售的吉尼斯世界纪录.当谭教授谈起国 ...

最新文章

  1. 华为鸿蒙系统强势来袭,呼之欲出的华为神作——鸿蒙2.0 强势来袭
  2. 第二百九十二节,RabbitMQ多设备消息队列-Python开发
  3. KVC/KVO 本质
  4. 西点军校邀马云谈领导力:要为年轻人和未来做决策_演讲
  5. php post请求后端拿不到值_Ajax 提交POST后,后台php 无法获取$POST值
  6. Java常用性能分析工具 jconsole、jvisualvm、 jstat、jinfo、jmap、jhat、jstack
  7. bzoj2438 luogu4819 [中山市选]杀人游戏
  8. 清北学堂模拟day4 捡金币
  9. JNDI配置数据库连接
  10. lenovo L480 进入bios_小白福利教程:如何刷显卡BIOS以及强刷显卡BIOS(一)
  11. Instant及LocalDateTime等使用方法
  12. pdf文件如何在安卓手机端不用下载在线预览
  13. 垃圾分类回收APP开发解决方案
  14. Android 拍照添加时间水印
  15. 如何用uni-app做一个领优惠券H5、小程序商城(一)
  16. 建立区域经济大脑,驱动产业创新发展
  17. 北大青鸟毕业的程序员该何去何从
  18. 面试之必掌握知识点:红黑树(一)
  19. 二十三 HDP搭建大数据环境
  20. 域控中将计算机账户移动到特定OU下

热门文章

  1. H264/AVC-基本概念和码流结构
  2. ui自动化html模板,webui 自动化 (utx+unitest+HTMLTestRunner_cn)
  3. AI数据服务行业进入“认知战争”,云测数据凭什么稳居行业TOP1?
  4. 2019腾讯广告算法大赛解析
  5. Python 批量合并 Excel工作簿
  6. 资源池以及资源池化是什么意思?
  7. 亲手养成一只自己的动漫主播!单张头像生成动画,可指定姿态或真人视频迁移...
  8. 怎样更改itunes备份位置_iTunes备份路径怎么改?教你无脑修改iPhone备份文件路径...
  9. As of Dart Sass 2.0.0 弃用 除法符号“/” element-ui自定义皮肤样式报错,但能运行
  10. linux系统怎么清理磁盘空间,分享5个如何给Ubuntu系统清理磁盘空间、清除垃圾的方法...