记录编号 |
26815 |
评测结果 |
AAATT |
题目名称 |
管道系统 |
最终得分 |
60 |
用户昵称 |
.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;
}