fzu1977
题解:
和前两题差不多
只不过变成了有些一定走,有些不一定
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int HASH=;
const int STATE=;
int N,M,code[],maze[][],ch[],isend;
struct HASHMAP
{
int head[HASH],next[STATE],size;
ll state[STATE],f[STATE];
void init()
{
size=;
memset(head,-,sizeof(head));
}
void push(ll st,ll ans)
{
int h=st%HASH;
for (int i=head[h];i!=-;i=next[i])
if (state[i]==st)
{
f[i]+=ans;
return;
}
state[size]=st;
f[size]=ans;
next[size]=head[h];
head[h]=size++;
}
}hm[];
void decode(int *code,int m,ll st)
{
for (int i=m;i>=;i--)
{
code[i]=st&;
st>>=;
}
isend=st&;
}
ll encode(int *code,int m)
{
int cnt=;
memset(ch,-,sizeof(ch));
ch[]=;
ll st=isend;
for (int i=;i<=m;i++)
{
if (ch[code[i]]==-)ch[code[i]]=cnt++;
code[i]=ch[code[i]];
st<<=;
st|=code[i];
}
return st;
}
void shift(int *code,int m)
{
for (int i=m;i>;i--)code[i]=code[i-];
code[]=;
} void dpblank(int i,int j,int cur)
{
int left,up;
for (int k=;k<hm[cur].size;k++)
{
decode(code,M,hm[cur].state[k]);
left=code[j-];
up=code[j];
if (isend)
{
if (left||up||maze[i][j]==)continue;
code[j-]=code[j]=;
if (j==M)shift(code,M);
hm[cur^].push(encode(code,M),hm[cur].f[k]);
continue;
}
if (left&&up)
{
if (left==up)
{
code[j-]=code[j]=;
isend=;
if(j==M)shift(code,M);
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
else
{
code[j-]=code[j]=;
for (int t=;t<=M;t++)
if (code[t]==up)code[t]=left;
if (j==M)shift(code,M);
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
}
else if ((left&&(!up))||((!left)&&up))
{
int t;
if (left)t=left;
else t=up;
if (maze[i][j+])
{
code[j-]=;
code[j]=t;
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
if (maze[i+][j])
{
code[j-]=t;
code[j]=;
if (j==M)shift(code,M);
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
}
else
{
if (maze[i][j+]&&maze[i+][j])
{
code[j-]=code[j]=;
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
if (maze[i][j]==)
{
code[j-]=code[j]=;
if (j==M)shift(code,M);
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
}
}
}
void dpblock(int i,int j,int cur)
{
for (int k=;k<hm[cur].size;k++)
{
decode(code,M,hm[cur].state[k]);
code[j-]=code[j]=;
if (j==M)shift(code,M);
hm[cur^].push(encode(code,M),hm[cur].f[k]);
}
}
char str[];
void init()
{
scanf("%d%d",&N,&M);
memset(maze,,sizeof(maze));
for (int i=;i<=N;i++)
{
scanf("%s",&str);
for (int j=;j<=M;j++)
{
if (str[j-]=='*')maze[i][j]=;
else if (str[j-]=='O')maze[i][j]=;
}
}
}
void solve()
{
int cur=;
hm[cur].init();
hm[cur].push(,);
for (int i=;i<=N;i++)
for (int j=;j<=M;j++)
{
hm[cur^].init();
if(maze[i][j])dpblank(i,j,cur);
else dpblock(i,j,cur);
cur^=;
}
ll ans=;
for (int i=;i<hm[cur].size;i++)ans+=hm[cur].f[i];
printf("%I64d\n",ans);
}
int main()
{
int T,iCase=;
scanf("%d",&T);
while (T--)
{
iCase++;
printf("Case %d: ",iCase);
init();
solve();
}
return ;
}
fzu1977的更多相关文章
- FZU1977 Pandora adventure —— 插头DP
题目链接:https://vjudge.net/problem/FZU-1977 Problem 1977 Pandora adventure Accept: 597 Submit: 2199 ...
- [FZU1977] Pandora adventure
来学插头DP了= = GDKOI前觉得不会考数位DP,GDOI前觉得插头DP用不上.. 结果令人伤感>_< 这题并不用增加状态.. 只要在形成环的时候,让形成环的位置在最后一个必走点之后, ...
- 初探插头dp
开学那个月学了点新东西,不知道还记不记得了,mark一下 感觉cdq的论文讲的很详细 题主要跟着kuangbin巨做了几道基础的 http://www.cnblogs.com/kuangbin/arc ...
随机推荐
- js常见知识点3.面向对象之继承、设计模式
一.面向对象的三大特征 建议回复: 封装:屏蔽内部细节.调用外部接口实现对应功能(函数调用) 继承:子类继承父类中的属性和方法 多态(js中不存在多态的概念) 二.继承 建议回复: 继承:子类继承父类 ...
- Codeforces 1005 F - Berland and the Shortest Paths
F - Berland and the Shortest Paths 思路: bfs+dfs 首先,bfs找出1到其他点的最短路径大小dis[i] 然后对于2...n中的每个节点u,找到它所能改变的所 ...
- 最全的SpringCloud视频教程
史上最全的SpringCloud视频教程 转自:https://blog.csdn.net/itmayeidu/article/details/79426589 史上最全的SpringCloud视频教 ...
- C#通过 “枚举数支持在指定类型的集合上进行简单迭代” 的概念获取List的一种方式
using System; using System.Collections.Generic; using System.Linq; namespace myMethod { class Animal ...
- 腾讯tOS死亡或注定,为何国内无自主ROM?
http://tech.sina.com.cn/roll/2017-06-26/doc-ifyhmtrw4006354.shtml 腾讯OS死亡或注定,为何国内无自主ROM? 2017年06月26日 ...
- Confluence 6 编辑一个空间的配色方案
空间默认继承全局的配色方案.但是,如果你是空间管理员的话,你可以对默认继承的全局方案进行调整,使用自定义的配色方案. 为一个空间修改配色方案: 进入空间后,然后从边栏的底部选择 空间工具(Space ...
- 03 flask数据库操作、flask-session、蓝图
ORM ORM 全拼Object-Relation Mapping,中文意为 对象-关系映射.主要实现模型对象到关系数据库数据的映射. 1.优点 : 只需要面向对象编程, 不需要面向数据库编写代码. ...
- 『TensorFlow』SSD源码学习_其三:锚框生成
Fork版本项目地址:SSD 上一节中我们定义了vgg_300的网络结构,实际使用中还需要匹配SSD另一关键组件:被选取特征层的搜索网格.在项目中,vgg_300网络和网格生成都被统一进一个class ...
- js字符串转日期兼容性
今天遇到个bug,安卓上是好的,ios就不行.然后我就把可能用到的值都打印出来,发现日期比较一项在苹果机上就显示false,而谷歌浏览器是true.突然回忆起以前开发遇到过类似的问题,都是出在字符串转 ...
- 配置ssh免密登录
安装ssh sudo apt-get install ssh 产生密钥:ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa (rsa为ssh的加密方式 ...