记录编号 26815 评测结果 AAATT
题目名称 管道系统 最终得分 60
用户昵称 Gravatar.Xmz 是否通过 未通过
代码语言 C++ 运行时间 2.001 s
提交时间 2011-07-27 14:43:41 内存使用 1.84 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define MM(a,b) memset(a,b,sizeof(a))
#define add(a,b) addedge(num[i][j][a],num[i][j][b])
#define ax(a) addedge(num[i][j][a],x)

using namespace std;

struct edge
{
	int t;
	edge *next;
}E[200001],*V[10001];
int eh,n,m,S,T;
int num[11][11][4];
inline void addedge(int a,int b)
{
	E[++eh].next=V[a];  V[a]=E+eh;  V[a]->t=b;
	E[++eh].next=V[b];  V[b]=E+eh;  V[b]->t=a;
}

void perdo()
{
	int cnt=0;
	
	for (int i=1;i<=6;i++)
		num[i][1][0]=++cnt;
	for (int i=1;i<=6;i++)
	for (int j=1;j<=6;j++)
		num[i][j+1][0]=num[i][j][3]=++cnt;
	for (int j=1;j<=6;j++)
		num[1][j][1]=++cnt;
	for (int i=1;i<=6;i++)
	for (int j=1;j<=6;j++)
		num[i+1][j][1]=num[i][j][2]=++cnt;
}

void init()
{
	int eh=0;int x=1000;
	MM(V,0);
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
	{
		int t;
		scanf("%d",&t);
		switch (t)
		{
			case 1 :
			add(1,2);                                    break;
			case 2 :
			add(0,3);                                    break;
			case 3 :
			add(0,1);                                    break;
			case 4 :
			add(0,2);                                    break;
			case 5 :
			add(2,3);                                    break;
			case 6 :
			add(1,3);                                    break;
			case 7 :
			x++;ax(0);ax(1);ax(2);                       break;
			case 8 :
			x++;ax(0);ax(2);ax(3);                       break;
			case 9 :
			x++;ax(2);ax(1);ax(3);                       break;
			case 10 :
			x++;ax(0);ax(1);ax(3);                       break;
			case 11 :
			x++;ax(0);ax(1);ax(2);ax(3);                 break;
			case 12 :
			add(0,3);add(1,2);                           break;
			case 13 :
			add(0,1);add(2,3);                           break;
			case 14 :
			add(0,2);add(1,3);                           break;
		}
	}
}

bool y[10001];
long long ans;
void dfs(int u)
{
	if (u==T) {ans++;return;}
	y[u]=true;
	for (edge *e=V[u];e;e=e->next)
	if (!y[e->t])
	{
		dfs(e->t);
	}
	y[u]=false;
}

void solve()
{
	ans=0;
	int a,b,o; char c[11];
	scanf("%d%d%s",&a,&b,c);
	if (c[0]=='U') o=1;
	if (c[0]=='L') o=0;
	if (c[0]=='R') o=3;
	if (c[0]=='D') o=2;
	S=num[a][b][o];
	scanf("%d%d%s",&a,&b,c);
	if (c[0]=='U') o=1;
	if (c[0]=='L') o=0;
	if (c[0]=='R') o=3;
	if (c[0]=='D') o=2;
	T=num[a][b][o];
	dfs(S);
	printf("%lld\n",ans);
}

int main()
{
	freopen("paipe.in","r",stdin);
	freopen("paipe.out","w",stdout);
	perdo();
	while (scanf("%d%d",&n,&m)!=EOF)
	{
		init();
		solve();
	}
	return 0;
}