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 ...
随机推荐
- Java代理机制之初见(理解及实现)
都知道Java中的Spring,有一重要思想:AOP,实现原理也就是Java的动态代理机制.初见代理这个名词时,觉得生活中常有代理的这一说法. 那么,在Java中,代理又是什么呢?它又是如何实现的?实 ...
- IOException parsing XML document from class path resource [WebRoot/WEB-INF/applicationContext.xml];
parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io. ...
- 虚拟机vmnet0、vmnet1和vmnet8的区别
vmnet0,实际上就是一个虚拟的网桥 vmnet0,实际上就是一个虚拟的网桥,这个网桥有很若干个端口,一个端口用于连接你的Host,一个端口用于连接你的虚拟机,他们的位置是对等的,谁也不是谁的网关. ...
- mongodb分享(二)
上次讲的:查询find\findone\pretty.条件操作符 (大于.小于.大于等于.小于等于.不等于,$type).limit\skip.sort.Db.postjson.getIndexes( ...
- 创建型模式之Builder(建造者)模式
GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq 一.定义 建造者模式 ...
- DPDK 16.04/16.11.2 默认tx offload是关闭的引起tx vlan offload无效
打开IXGBE调试日志发发现:tx使用ixgbe_xmit_pkts_vec,默认tx offload无效了PMD: ixgbe_set_tx_function(): Using simple tx ...
- Okhttp 插入缓存拦截器 解析
我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下 会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还 ...
- 让你明白kvm是什么
参考:https://blog.csdn.net/bbwangj/article/details/80465320 KVM 工具集合: libvirt:操作和管理KVM虚机的虚拟化 API,使用 C ...
- 解决spring-boot启动异常Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
第一种: 需要在主类头加上 @EnableAutoConfiguration 第二种: pom文件是否加了 <dependency> <groupId>org.mybatis ...
- WDA基础四:Select-option的使用
select option是方便用户和数据处理的,就是丑了点... 前面使用的input直接做查询条件有哥弊端,就是查询的时候需要判断字段是否有选择条件,然后要将选择条件做成range table.. ...