记录编号 26807 评测结果 AWWTT
题目名称 管道系统 最终得分 20
用户昵称 GravatarPurpleShadow 是否通过 未通过
代码语言 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;
}