fzu 1977 Pandora adventure
来源:互联网 发布:svg在线编辑器源码 编辑:程序博客网 时间:2024/04/30 23:37
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1977
题目大意及思路:简单回路数问题,不过有必走点和非必走点之分,做法是在要新加一个括号时判断是否必走,如果不是必走,则可不加括号,还有就是在经过最后一个必走点后,只要存在简单回路就加入ans。
#include<stdio.h>#include<string.h>#define Max 20010#define Hash 3007int n,m,ex,ey,cur,mp[15][15],a1,a2,a3,b1,b2,b3,count=1;__int64 ans=0;int stack[15],f[15];char str[15];struct node{ int size,next[Max],p[Hash],state[Max]; __int64 f[Max]; inline void init() { memset(p,-1,sizeof(p)); size=0; } inline void push(int st,__int64 val) { int i,u=st%Hash; int ss=st; for(i=p[u];i!=-1;i=next[i]) { if(state[i]==st) { f[i]+=val; return; } } state[size]=st;f[size]=val; next[size]=p[u]; p[u]=size++; }}dp[2];inline void decode(int st){ int top=0; for(int i=0;i<=m;i++) { if((st&3)==1) stack[top++]=i; else if((st&3)==2) { f[stack[top-1]]=i; f[i]=stack[top-1]; top--; } st>>=2; }}inline void shift(){ for(int k=0;k<dp[cur].size;k++) dp[cur^1].push(dp[cur].state[k]<<2,dp[cur].f[k]);}inline void dpblank(int i,int j){ int k,left,up; for(k=0;k<dp[cur].size;k++) { int st=dp[cur].state[k]; left=st&a3; up=st&b3; if(left&&up) { if(left==a1&&up==b2) { if((st^left^up)==0&&i*(m+1)+j>=ex*(m+1)+ey) ans+=dp[cur].f[k]; } else { if(left==a2&&up==b1) dp[cur^1].push(st^left^up,dp[cur].f[k]); if(left==a1&&up==b1) { decode(st); dp[cur^1].push(st^left^up^(3<<(2*f[j])),dp[cur].f[k]); } if(left==a2&&up==b2) { decode(st); dp[cur^1].push(st^left^up^(3<<(2*f[j-1])),dp[cur].f[k]); } } } else if(left) { if(mp[i][j+1]) dp[cur^1].push((st^left)|(left<<2),dp[cur].f[k]); if(mp[i+1][j]) dp[cur^1].push(st,dp[cur].f[k]); } else if(up) { if(mp[i][j+1]) dp[cur^1].push(st,dp[cur].f[k]); if(mp[i+1][j]) dp[cur^1].push((st^up)|(up>>2),dp[cur].f[k]); } else { if(mp[i][j+1]&&mp[i+1][j]) dp[cur^1].push(st|a1|b2,dp[cur].f[k]); if(mp[i][j]==1) dp[cur^1].push(st,dp[cur].f[k]); } }}inline void solve(){ int i,j,k; ans=0; cur=0; dp[0].init(); dp[0].push(0,1); for(i=1;i<=n;i++) { dp[cur^1].init(); shift(); cur^=1; b1=1;b2=2; for(j=1;j<=m;j++) { a1=b1;a2=b2;a3=a1|a2; b1<<=2;b2<<=2;b3=b1|b2; if(mp[i][j]) { dp[cur^1].init(); dpblank(i,j); cur^=1; } } } printf("Case %d: %I64d\n",count++,ans);}int main(){ int i,j,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(mp,0,sizeof(mp)); for(i=1;i<=n;i++) { scanf("%s",str+1); for(j=1;j<=m;j++) { if(str[j]=='*') mp[i][j]=1; else if(str[j]=='O') mp[ex=i][ey=j]=2; } } solve(); } return 0;}
- fzu 1977 Pandora adventure
- fzu 1977 Pandora adventure
- FZU 1977 Pandora adventure
- FZU 1977 Pandora adventure
- FZU 1977 Pandora adventure(插头DP)
- FZU 1977 Pandora adventure (插头dp)
- FZU 1977 Pandora adventure 插头dp
- FZU - 1977 Pandora adventure【插头DP】
- FZU 1977 Pandora adventure 解题报告(插头DP)
- fzu 1977 Pandora adventure(插头DP一条回路 格子的占用或不占用)
- foj 1977 Pandora adventure(插头DP)
- Pandora adventure FZU1977
- FZU1977 Pandora adventure
- FZU 2005 Computer Virus on Planet Pandora (AC自动机)
- fzu 1977
- Suzhou Adventure
- FZU
- FZU
- 数据库范式
- bean.xml,c3p0,dbcp
- C# 制作不规则窗体的两种解决方案
- 构造方法与c中的析构方法
- main方法
- fzu 1977 Pandora adventure
- Qt常用类
- BulkLoader
- 《性能测试诊断分析与优化》一书封面已设计好,不日将面市!
- 硅谷创业天堂的启示!
- 马德里商标查询详解
- java反射
- Java线程安全总结
- afx_msg函数意思