记录编号 |
26807 |
评测结果 |
AWWTT |
题目名称 |
管道系统 |
最终得分 |
20 |
用户昵称 |
PurpleShadow |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
2.001 s |
提交时间 |
2011-07-27 14:35:03 |
内存使用 |
0.26 MiB |
显示代码纯文本
#include <cstdio>
#include <cstring>
const int N=7,fx[4]={0,1,-1,0},fy[4]={1,0,0,-1};
int Rs,Cs,Rt,Ct,n,m;
char Ds,Dt;
int G[N][N];
void Change(char& t)
{
if (t=='R') t=0;
if (t=='D') t=1;
if (t=='U') t=2;
if (t=='L') t=3;
}
bool init()
{
if (scanf("%d%d",&n,&m)==EOF) return 0;
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
scanf("%d",&G[i][j]);
scanf("%d%d %c%d%d %c",&Rs,&Cs,&Ds,&Rt,&Ct,&Dt);
Change(Ds);Change(Dt);
return 1;
}
int Ans;
inline void From(int &x,int c)
{
if (x==12)
{if (c==1||c==2) x=2;else x=1;}else
if (x==13)
{if (c==2||c==3) x=5;else x=3;}else
if (x==14)
{if (c==1||c==3) x=6;else x=4;}else
if (x<=11) x=0;
}
inline bool Path(int k,int c)
{
if (k==1&&(c==1||c==2)) return 1;
if (k==2&&(c==0||c==3)) return 1;
if (k==3&&(c==3||c==2)) return 1;
if (k==4&&(c==3||c==1)) return 1;
if (k==5&&(c==1||c==0)) return 1;
if (k==6&&(c==0||c==2)) return 1;
if (k==7&&(c!=0)) return 1;
if (k==8&&(c!=2)) return 1;
if (k==9&&(c!=3)) return 1;
if (k==10&&(c!=1)) return 1;
if (k==11) return 1;
return 0;
}
inline bool mayPath(int k,int c)
{
if ((k==12||k==1)&&(c==1||c==2)) return 1;
if ((k==12||k==2)&&(c==0||c==3)) return 1;
if ((k==13||k==3)&&(c==3||c==2)) return 1;
if ((k==14||k==4)&&(c==3||c==1)) return 1;
if ((k==13||k==5)&&(c==1||c==0)) return 1;
if ((k==14||k==6)&&(c==0||c==2)) return 1;
if (k==7&&(c!=0)) return 1;
if (k==8&&(c!=2)) return 1;
if (k==9&&(c!=3)) return 1;
if (k==10&&(c!=1)) return 1;
if (k==11) return 1;
return 0;
}
inline int Get(int F,int c)
{
if (F<=11) return F;
if (F==12)
{if (c==1||c==2) return 1;else return 2;}
if (F==13)
{if (c==2||c==3) return 3;else return 5;}
if (F==14)
{if (c==1||c==3) return 4;else return 6;}
return -1;
}
void dfs(int R,int C,int p)
{
if (R==Rt&&C==Ct)
{
++Ans;
return;
}
int Rn,Cn,tmp,USES;
for (int c=0;c<4;++c)
{
if (R==Rs&&C==Cs&&c==Ds) continue;
tmp=G[R][C];
From(G[R][C],p);
USES=Get(tmp,p);
if (Path(USES,c))
{
Rn=R+fx[c];
Cn=C+fy[c];
if (!mayPath(G[Rn][Cn],3-c))
{
G[R][C]=tmp;
continue;
}
dfs(Rn,Cn,c);
}
G[R][C]=tmp;
}
}
void slove()
{
if (!Path(G[Rs][Cs],Ds)||!Path(G[Rt][Ct],Dt))
{
printf("0\n");
return;
}
Ans=0;
dfs(Rs,Cs,3-Ds);
printf("%d\n",Ans);
}
int main()
{
freopen("paipe.in","r",stdin);
freopen("paipe.out","w",stdout);
while (init())
slove();
return 0;
}