记录编号 |
26814 |
评测结果 |
AAAAA |
题目名称 |
管道系统 |
最终得分 |
100 |
用户昵称 |
苏轼 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.006 s |
提交时间 |
2011-07-27 14:42:07 |
内存使用 |
0.53 MiB |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define pb push_back
#define mp make_pair
const int MAXN=100;
const int op[4]={2,3,0,1};
vector<int> way[12];
int way2[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void init()
{
#define makeit(x,a,b) way[x].pb(a);way[x].pb(b);
#define makeit2(x,a,b,c) way[x].pb(a);way[x].pb(b);way[x].pb(c);
makeit(1,0,2);
makeit(2,1,3);
makeit(3,0,3);
makeit(4,2,3);
makeit(5,1,2);
makeit(6,0,1);
makeit2(7,0,2,3);
makeit2(8,1,2,3);
makeit2(9,0,1,2);
makeit2(10,0,1,3);
way[11].pb(0);
way[11].pb(1);
way[11].pb(2);
way[11].pb(3);
}
struct Node
{
int v;
Node *next;
void *operator new(size_t,void *p){return p;}
Node (int _v,Node *_next):v(_v),next(_next){}
Node (){}
}*adj[MAXN],pool[MAXN*MAXN],*mem=pool;
inline void addedge(int u,int v)
{
adj[u]=new (mem++)Node(v,adj[u]);
}
int S,T,re;
bool vis[MAXN];
int belong[MAXN];
void dfs(int u)
{
if (u==T)
{
re++;
return ;
}
vis[u]=true;
for(Node *p=adj[u];p;p=p->next)
if (!vis[p->v])
dfs(p->v);
vis[u]=false;
}
int N,M;
int ma[MAXN][MAXN];
int plug[MAXN][MAXN][4];
int main()
{
freopen("paipe.in","r",stdin);
freopen("paipe.out","w",stdout);
init();
while(scanf("%d%d",&N,&M)!=EOF)
{
memset(adj,0,sizeof(adj));
memset(plug,0,sizeof(plug));
memset(belong,0,sizeof(belong));
mem=pool;
int tot=0;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
{
#define solve(x) \
{\
int y=x;\
tot++;\
for(int k=0,size=way[y].size();k<size;k++)\
plug[i][j][way[y][k]]=tot,belong[tot]=i*M+j;\
}
scanf("%d",&ma[i][j]);
if (ma[i][j]>=1 && ma[i][j]<=11)
solve(ma[i][j])
else if (ma[i][j]>11)
{
switch (ma[i][j])
{
case 12:
solve(1);
solve(2);
break;
case 13:
solve(3);
solve(5);
break;
case 14:
solve(4);
solve(6);
break;
}
}
}
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
if (ma[i][j])
for(int k=0;k<4;k++)
if (plug[i][j][k])
{
int x=i+way2[k][0],y=j+way2[k][1];
if (x>=0 && x<N && y>=0 && y<M && plug[x][y][op[k]])
addedge(plug[i][j][k],plug[x][y][op[k]]);
}
int Rs,Cs,Rt,Ct,ds,dt;
char Ds,Dt;
scanf("%d%d %c%d%d %c",&Rs,&Cs,&Ds,&Rt,&Ct,&Dt);
switch(Ds)
{
case 'U':ds=0;break;
case 'D':ds=2;break;
case 'L':ds=3;break;
case 'R':ds=1;break;
}
switch(Dt)
{
case 'U':dt=0;break;
case 'D':dt=2;break;
case 'L':dt=3;break;
case 'R':dt=1;break;
}
S=plug[Rs-1][Cs-1][ds];
T=plug[Rt-1][Ct-1][dt];
re=0;
if (S!=0 && T!=0)
dfs(S);
printf("%d\n",re);
}
return 0;
}