记录编号 26814 评测结果 AAAAA
题目名称 管道系统 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 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;
}