简单题意
n*m大小的矩形,起点在左上角, 终点在右下角,里面一个小矩形代表一个block。每个小矩形的边长都是2520, 小矩形的边有一个速度限制,范围是0~9, 0表示这条边不能行驶。输入部分,从上到下,从左到右, 每一条边是 "数字"+“空格”+“符号”的形式, 数字表示这条边的限速, 符号表示这条路是单向(分东西, 南北)的还是双向的。
解题思路形成过程
其实本来打算放弃的因为这个题的题干太吓人了,而且测试数据也是奇形怪状,不过看AC率挺高的,还是硬着头皮试试吧,我们高中班主任说过题干越长题越简单。即使拼命的读,还是好吃力呀。。去看看网上的题意吧,终于弄明白题意,发现输入好复杂呀,要处理很多东西,不过建好图之后只要用dijkstra算法套用一下就行了。
感想
大神好多呀,读题果然不是我的强项。
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int mapp[600][600];
int dijkstra(int start,int n)
{
int dis[600];
int visit[600];
int k,min;
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)dis[i]=INF;
dis[start]=0;
for(int i=1;i<=n;i++){
min=INF;
for(int j=1;j<=n;j++){
if(!visit[j]&&dis[j]<min){
min=dis[j];
k=j;
}
}
visit[k]=1;
for(int j=1;j<=n;j++){
if(mapp[k][j]!=0){
if(dis[j]>dis[k]+mapp[k][j])
dis[j]=dis[k]+mapp[k][j];
}
}
}
return dis[n];
}
int main()
{
freopen("in.txt","r",stdin);
int v, h, w;
char dir;
while(scanf("%d%d",&v,&h))
{
if(v==0 && h==0)break;
memset(mapp,0,sizeof(mapp));
int a,b;
for(int i=0;i<=v;i++){
for(int j = 1; j <= h; j++){
scanf("%d %c",&w,&dir);
if(w == 0)continue;
a=i*(h+1)+j;
b=a+1;
int ti=2520/w;
if(dir=='*')
mapp[a][b]=mapp[b][a]=ti;
else if(dir=='>')
mapp[a][b]=ti;
else
mapp[b][a]=ti;
}
if(i!=v){
for(int j=1;j<=h+1;j++){
scanf("%d %c",&w,&dir);
if(w==0)
continue;
a=i*(h+1)+j;
b=a+h+1;
int ti=2520/w;
if(dir=='*')
mapp[a][b]=mapp[b][a]=ti;
else if(dir=='v')
mapp[a][b]=ti;
else
mapp[b][a]=ti;
}
}
}
int tt=(v+1)*(h+1);
int ans=dijkstra(1,tt);
if(ans!=INF)
printf("%d blips\n",ans);
else
printf("Holiday\n");
}
return 0;
}