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 ...
随机推荐
- H5多媒体(用面向对象的方法控制视频、音频播放、暂停、延时暂停)
视频,音频播放器会是我们在工作中用到的一些h5新标签,它自带一些属性,比如暂停播放,快进快退,但是,我们经常不用原生的样式或者方法,我们需要自定义这些按钮来达到我们需要的样式,也需要我们自定义来实现一 ...
- MYSQL常用函数(时间和日期函数)
CURDATE()或CURRENT_DATE() 返回当前的日期 CURTIME()或CURRENT_TIME() 返回当前的时间 DATE_ADD(date,INTERVAL int keyword ...
- Centos 7 Docker安装配置
版本介绍 Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE.社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设 ...
- Codeforces 797B - Odd sum
B. Odd sum 题目链接:http://codeforces.com/problemset/problem/797/B time limit per test 1 second memory l ...
- Hive json字符串解析
在做数据测试时,会遇到数据库表里字段类型为json 的情况,而我们可能只关注该字段中的各别内容的信息,如下 content {"测试内容1":,"测试内容2": ...
- legend2---开发日志8(thinkphp和vue如何配合才能达到最优)
legend2---开发日志8(thinkphp和vue如何配合才能达到最优) 一.总结 一句话总结:凡是php可以做的,都可以先在后端处理好数据,然后再丢给前端 凡php可以做的,都可以先在后端处理 ...
- XGBoost介绍
- Confluence 6 创建一个项目空间
火星移民小组的程序需要一个地方能够调出他们任务的相关关键信息和资源,你的任务就是帮助他们实现和管理这个需求.这部分是比较容易实现的,因为这些信息需要让空间项目组中完全可见. 这样的话,你就可以设置项目 ...
- css之transform属性
定义元素的旋转(rotate),缩放(scale),移动(translate),倾斜(skew) rotate rotate(angle) 定义 2D 旋转,在参数中规定角度. rotate3d(x, ...
- 【洛谷p1106】删数问题
(洛谷t2755暂时过不去了) 删数问题[传送门] 洛谷算法标签: emmmm……删数问题又牵扯到了字符串.因为毕竟高精度的数240位呢!要是输入一个整型,要码240行来求出每一位……怕是还没求出来就 ...