CodeForces 115C. Plumber 解题报告
来源:互联网 发布:中国社会调查数据库 编辑:程序博客网 时间:2024/06/12 08:58
题目
题意:
n×m的的矩阵里,每个格子都有一个水管,并且水管是给出的4种形状的一个。有一些地方水管已经确定了,有一些还没有。若两个相邻的水管彼此没有连通则为泄漏。求不泄漏的方案数,不要求水管全部连成一条。
题解:
原本以为是简单的插头DP,但是看数据规模不可能。根据给出的四种水管,可知任何一种都和左右两格连且只连一个,上下也是,而且左右和上下是独立的,所以可以单独考虑一行和一列。
对一行而言,如果有已经确定的水管,要判断是否能满足:两根相邻的水管的距离和朝向是否相同。如果没有确定的,那么第一根水管可以连边界或者第二根,其后的水管在水平方向就全确定了而且一定有解。
竖直方向同理。
//Time:218ms//Memory:10000KB#include <iostream>#include <cstdlib>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <vector>#include <map>#include <queue>#include <set>#define MAXN 100010#define INF 1000000007#define MP(x,y) make_pair(x,y)#define FI first#define SE second#define EPS 1e-8using namespace std;char **ma;int ty[2][4]={{1,1,0,0},{1,0,0,1}};int pow_mod(long long a,int p,int mod){ long long ret=1; while(p) { if(p&1) ret=ret*a%mod; a=a*a%mod,p>>=1; } return ret;}int main(){ int n,m,cnt; while(scanf("%d%d",&n,&m)==2) { cnt=0; bool flag=1; ma=new char *[n]; for(int i=0;i<n;++i) { int pre=-1; bool tmp=1; ma[i]=new char [m+1]; scanf("%s",ma[i]); for(int j=0;j<m;++j) if(ma[i][j]>='0') { ma[i][j]-='1'; if(pre!=-1) flag&=((j-pre)&1)==(ty[0][ma[i][j]]^ty[0][ma[i][pre]]); pre=j; tmp=0; } if(tmp) ++cnt; } for(int i=0;i<m&&flag;++i) { int pre=-1; bool tmp=1; for(int j=0;j<n;++j) if(ma[j][i]<=3) { if(pre!=-1) flag&=((j-pre)&1)==(ty[1][ma[j][i]]^ty[1][ma[pre][i]]); pre=j; tmp=0; } if(tmp) ++cnt; } printf("%d\n",flag?pow_mod(2,cnt,1000003):0); for(int i=0;i<n;++i) delete ma[i]; delete ma; } return 0;}
- CodeForces 115C. Plumber 解题报告
- Codeforces 115C Plumber
- Codeforces 117C解题报告
- codeforces 257C解题报告
- CodeForces 173 C. Spiral Maximum 解题报告
- codeforces Round #237(div2) C解题报告
- codeforces Round #241(div2) C解题报告
- codeforces Round #269(div2) C解题报告
- codeforces Round #267(div2) C解题报告
- codeforces Round #271(div2) C解题报告
- codeforces Round #272(div2) C解题报告
- codeforces Round #264(div2) C解题报告
- codeforces Round #263(div2) C解题报告
- codeforces Round #273(div2) C解题报告
- codeforces Round #274(div2) C解题报告
- codeforces Round #261(div2) C解题报告
- codeforces Round #260(div2) C解题报告
- codeforces Round #259(div2) C解题报告
- Linux最常用的命令
- android和iOS平台的崩溃捕获和收集
- java实现求解n宫格
- C++读写excel文件(二)—— 用CSpreadSheet读写(by yukin_xue)
- UIButton按钮的背景图和字体颜色
- CodeForces 115C. Plumber 解题报告
- 修改 堆栈大小 普适性方案总结 (跨平台 windows linux 栈设置大小)
- Looper、handle、Message图文详解
- 如何实现WORKFLOW通知页面跳转到FORM
- CheckBoxList 多选 样式 jquery获取选择项 C#获取选择项
- 浏览器多标签页同步、竞争问题
- netfilter sock
- 新人新环境生存法则
- Session