记录编号 46593 评测结果 AAAAA
题目名称 城市街道交通费系统 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2012-10-28 21:29:54 内存使用 3.39 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

//0	dong	East
//1	xi		West
//2	nan		South
//3	bei		North

const short RUL[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
const short COST[4][4]={
/*     E  W  S  N     */
/*E*/{00,10,05,01},
/*W*/{10,00,01,05},
/*S*/{01,05,00,10},
/*N*/{05,01,10,00},};

char map[110][110];
int f[4][110][110];
bool used[4][110][110];

int minint(int a,int b)
{
	if (a<b)
		return(a);
	return(b);
}

int main(void)
{
	freopen("erp.in","r",stdin);
	freopen("erp.out","w",stdout);
	int i,j,k,l,n,m,xe,ye,xs,ys,xt,yt,costnow,templ;
	bool un=true,succ,zero;
	cin>>n>>m;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
		{
			for (k=0;k<4;k++)
				f[k][i][j]=~0u>>1;
			cin>>map[i][j];
			if (map[i][j]=='F')
			{
				xe=i;
				ye=j;
				map[i][j]='#';
			}
			else if (map[i][j]!='#'&&map[i][j]!='.')
			{
				xs=i;
				ys=j;
				if (map[i][j]=='E')
				{
					f[0][i][j]=0;
				}
				else if (map[i][j]=='W')
				{
					f[1][i][j]=0;
				}
				else if (map[i][j]=='S')
				{
					f[2][i][j]=0;
				}
				else if (map[i][j]=='N')
				{
					f[3][i][j]=0;
				}
				map[i][j]='#';
			}
		}
	costnow=0;
	while (un)
	{
		zero=false;
		for (i=1;un&&i<=n;i++)
			for (j=1;un&&j<=m;j++)
				for (k=0;k<4;k++)
					if (f[k][i][j]==costnow)
					{
						if (i==xe&&j==ye)
							un=false;
						if (!un)
							break;
						if (used[k][i][j])
							continue;
						used[k][i][j]=true;
						succ=false;
						for (l=0;l<4;l++)
						{
							if (COST[k][l]==10)
							{
								templ=l;
								continue;
							}
							xt=i+RUL[l][0];
							yt=j+RUL[l][1];
							if (map[xt][yt]=='.')
								continue;
							succ=true;
							while (map[xt][yt]=='#')
							{
								if (f[l][xt][yt]>f[k][i][j]+COST[k][l])
								{
									f[l][xt][yt]=f[k][i][j]+COST[k][l];
									used[l][xt][yt]=false;
								}
								if (f[l][xt][yt]==f[k][i][j])
									zero=true;
								xt+=RUL[l][0];
								yt+=RUL[l][1];
							}
						}
						if (!succ)
						{
							xt=i+RUL[templ][0];
							yt=j+RUL[templ][1];
							if (map[xt][yt]=='.')
								continue;
							while (map[xt][yt]=='#')
							{
								f[templ][xt][yt]=minint(f[templ][xt][yt],f[k][i][j]+COST[k][templ]);
								xt+=RUL[templ][0];
								yt+=RUL[templ][1];
							}
						}
					}
		if (!zero)
			costnow++;
	}
	cout<<minint(minint(f[0][xe][ye],f[1][xe][ye]),minint(f[2][xe][ye],f[3][xe][ye]))<<endl;
	return(0);
}