题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2722
第一次看见这题的时候没敢做,看题目就挺吓人的。。不过今天仔细读了读题,也就是建图的时候处理一下而已。。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>
using namespace std;
int n, m, d[1000], maxint=100000000, mp[1000][1000], vis[1000];
int fang(char c)
{
if(c=='^')
return 1;
else if(c=='v')
return 2;
else if(c=='<')
return 3;
else if(c=='>')
return 4;
else if(c=='*')
return 5;
}
void dijk()
{
int i, j, min1, pos;
for(i=0; i<(n+1)*(m+1); i++)
{
d[i]=mp[0][i];
}
vis[0]=1;
for(i=1; i<(n+1)*(m+1); i++)
{
min1=maxint;
for(j=1; j<(n+1)*(m+1); j++)
{
if(!vis[j]&&min1>d[j])
{
min1=d[j];
pos=j;
}
}
if(min1==maxint)
{
break;
}
vis[pos]=1;
for(j=1; j<(n+1)*(m+1); j++)
{
if(!vis[j]&&d[j]>d[pos]+mp[pos][j])
{
d[j]=d[pos]+mp[pos][j];
}
}
}
if(d[(n+1)*(m+1)-1]==maxint)
printf("Holiday\n");
else
printf("%d blips\n",d[(n+1)*(m+1)-1]);
}
int main()
{
int i, j;
char s[100][100];
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
for(i=0; i<(n+1)*(m+1); i++)
{
for(j=0; j<(n+1)*(m+1); j++)
{
mp[i][j]=maxint;
}
}
memset(vis,0,sizeof(vis));
getchar();
for(i=0; i<n*2+1; i++)
gets(s[i]);
for(i=0; i<n*2+1; i++)
{
for(j=0; j<4*(i%2)+m*4; j+=4)
{
if(i%2==0)
{
if(s[i][j]=='0')
{
mp[(m+1)*(i/2)+j/4][(m+1)*(i/2)+j/4+1]=mp[(m+1)*(i/2)+j/4+1][(m+1)*(i/2)+j/4]=maxint;
}
else
{
if(fang(s[i][j+2])==5)
{
mp[(m+1)*(i/2)+j/4][(m+1)*(i/2)+j/4+1]=mp[(m+1)*(i/2)+j/4+1][(m+1)*(i/2)+j/4]=2520/(s[i][j]-'0');
}
else if(fang(s[i][j+2])==3)
{
mp[(m+1)*(i/2)+j/4+1][(m+1)*(i/2)+j/4]=2520/(s[i][j]-'0');
}
else if(fang(s[i][j+2])==4)
{
mp[(m+1)*(i/2)+j/4][(m+1)*(i/2)+j/4+1]=2520/(s[i][j]-'0');
}
}
}
else
{
if(s[i][j]=='0')
{
mp[(m+1)*(i/2)+j/4][(m+1)*(i/2)+j/4+m+1]=mp[(m+1)*(i/2)+j/4+m+1][(m+1)*(i/2)+j/4]=maxint;
}
else
{
if(fang(s[i][j+2])==5)
{
mp[(m+1)*(i/2)+j/4][(m+1)*(i/2)+j/4+m+1]=mp[(m+1)*(i/2)+j/4+m+1][(m+1)*(i/2)+j/4]=2520/(s[i][j]-'0');
}
else if(fang(s[i][j+2])==1)
{
mp[(m+1)*(i/2)+j/4+m+1][(m+1)*(i/2)+j/4]=2520/(s[i][j]-'0');
}
else if(fang(s[i][j+2])==2)
{
mp[(m+1)*(i/2)+j/4][(m+1)*(i/2)+j/4+m+1]=2520/(s[i][j]-'0');
}
}
}
}
}
/*for(i=0;i<(n+1)*(m+1);i++)
{
for(j=0;j<(n+1)*(m+1);j++)
{
printf("%d ",mp[i][j]);
}
printf("\n");
}*/
dijk();
}
return 0;
}