博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P3659 [USACO17FEB]Why Did the Cow Cross the Road I G
阅读量:4974 次
发布时间:2019-06-12

本文共 4257 字,大约阅读时间需要 14 分钟。

//神题目(题目一开始就理解错了)。。。

题目描述

Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of roads, making it impossible for his cows to travel around without crossing many of them.

奶牛们为什么要穿马路?一个原因只是因为FJ的牧场的路实在是太多了,使得奶牛们每天不得不穿梭在许许多多的马路中央

FJ's farm is arranged as an N \times NN×N square grid of fields (3 \leq N \leq 1003N100), with a set of N-1N1 north-south roads and N-1N1 east-west roads running through the interior of the farm serving as dividers between the fields. A tall fence runs around the external perimeter, preventing cows from leaving the farm. Bessie the cow can move freely from any field to any other adjacent field (north, east, south, or west), as long as she carefully looks both ways before crossing the road separating the two fields. It takes her TT units of time to cross a road (0 \leq T \leq 1,000,0000T1,000,000).

FJ的牧场可以看作是一块 N\times NN×N 的田地(3\le N\le 1003N100),N-1N1 条南北向的道路和 N-1N1 条东西向的道路贯穿整个牧场,同时是每块田野的分界线。牧场的最外面是一圈高大的栅栏以防止奶牛离开牧场。Bessie只要穿过分离两块田野的道路,就可以从任何田野移动到与其相邻的田野里去(北,东,南或西)。当然,Bessie穿过每一条马路都是需要TT 时间的。(0\le T\le 1,000,0000T1,000,000)

One day, FJ invites Bessie to visit his house for a friendly game of chess. Bessie starts out in the north-west corner field and FJ's house is in the south-east corner field, so Bessie has quite a walk ahead of her. Since she gets hungry along the way, she stops at every third field she visits to eat grass (not including her starting field, but including possibly the final field in which FJ's house resides). Some fields are grassier than others, so the amount of time required for stopping to eat depends on the field in which she stops.

有一天,FJ邀请Bessie来他家下棋,Bessie从牧场的西北角出发,FJ的家在牧场的东南角。因为Bessie在中途可能会饿,所以她每走过三块田野就要停下来,享用她所在田野上的新鲜的牧草(不包括Bessie的出发点,但是可能会包括终点FJ的家),牧场上有些田野的牧草长得比其他地方茂盛,所以Bessie对应的停留时间也会变长。

Please help Bessie determine the minimum amount of time it will take to reach FJ's house.

请帮帮Bessie计算出她走到FJ家的最短时间。

输入输出格式

输入格式:

 

The first line of input contains NN and TT. The next NN lines each contain NN positive integers (each at most 100,000) describing the amount of time required to eat grass in each field. The first number of the first line is the north-west corner.

接下来 NN 行,每行 NN 个数表示每块田野Bessie需要停留的时间(每块最多不超过100,000100,000),第一行的第一块田野是牧场的西北角

 

输出格式:

 

Print the minimum amount of time required for Bessie to travel to FJ's house.

一行一个整数表示Bessie走到FJ家的最短时间

 

输入输出样例

 

输入样例#1: 
4 230 92 36 1038 85 60 1641 13 5 6820 97 13 80
输出样例#1: 
31

 

说明

 

The optimal solution for this example involves moving east 3 squares (eating the "10"), then moving south twice and west once (eating the "5"), and finally moving south and east to the goal.

 

对于样例,Bessie先向东走过了三块田野(在“10”停留),再向南走两步,又向西走了一步(在“5”停留),最后向南走一步,再向东走一步到达FJ的家(不用停留),总共时间是15(停留时间)+16(穿马路时间)=31

 

感谢@jzqjzq 提供翻译

 

题目解释:牛可以往回走

例:    1 ——2——3

  牛可以1->2->1->2;

 

就可以类比于牛走一步和走三步(但是走一步时的时间也是加上走3步的时间)

将所有的方向枚举出来。。。然后。。宽搜?

没了。。。

(根本没有洛谷原来的题解麻烦嘛)

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 int n,v[110][110]; 8 long long dis[110][110],t; 9 bool vis[110][110];10 struct node11 {12 int x,y;13 };14 int dx[]={
0,0,3,-3,1,1,2,2,-1,-1,-2,-2,0,0,1,-1};15 int dy[]={
3,-3,0,0,2,-2,1,-1,2,-2,1,-1,1,-1,0,0};16 void spfa(int x,int y)17 {18 queue
q;19 q.push((node){x,y});20 memset(dis,0x7f,sizeof(dis));21 dis[x][y]=0; vis[x][y]=1;22 do23 {24 node u=q.front();q.pop();25 vis[u.x][u.y]=0;26 for(int i=0;i<16;i++)27 { int tx=u.x+dx[i],ty=u.y+dy[i];28 if(tx>=1&&tx<=n&&ty>=1&&ty<=n)29 {30 if(dis[tx][ty]>dis[u.x][u.y]+v[tx][ty]+t*3)31 { 32 dis[tx][ty]=dis[u.x][u.y]+v[tx][ty]+t*3;33 if(!vis[tx][ty])34 {35 vis[tx][ty]=1;q.push((node){tx,ty});36 }37 }38 }39 }40 }while(q.size()!=0);41 }42 int main()43 { ios::sync_with_stdio(false);44 cin>>n>>t;45 for(int i=1;i<=n;i++)46 for(int j=1;j<=n;j++)47 cin>>v[i][j];48 spfa(1,1);49 long long ans;50 ans=dis[n][n];//参照题解:牛不可能直接到达,所以得枚举终点3步之内的所有点的值+位移的时间; 51 ans=min(ans,dis[n][n-1]+t);52 ans=min(ans,dis[n-1][n]+t);53 ans=min(ans,dis[n][n-2]+t*2);54 ans=min(ans,dis[n-2][n]+t*2);55 ans=min(ans,dis[n-1][n-1]+t*2);56 printf("%lld",ans);57 return 0;58 }59

 

转载于:https://www.cnblogs.com/Slager-Z/p/7753602.html

你可能感兴趣的文章
舍伍德算法(转 用来说明算法导论题目!!!)
查看>>
hdu 6026 Deleting Edges 江苏徐州邀请赛K
查看>>
【题解】 bzoj1207: [HNOI2004]打鼹鼠 (动态规划)
查看>>
java并发编程 - Exexctor简介
查看>>
jquery,fn,extend和jquery.extend
查看>>
js奇葩错误
查看>>
poj 3974 Palindrome
查看>>
等比例缩放图片
查看>>
实现笛卡尔心形线的重复循环绘制
查看>>
实验报告四
查看>>
JS学习笔记——标准对象
查看>>
Linux操作命令(二)
查看>>
南柯一梦
查看>>
【0】开始学习安卓了
查看>>
window安装svn
查看>>
面向对象之多态、多态性
查看>>
生产者与消费者——厨师和消费者之间的问题
查看>>
选择排序
查看>>
将摄像头原始RGB数据流编码成H.264文件
查看>>
gcc中预定义的宏__GNUC__
查看>>