2021.08.16 P1300 城市街道交通费系统(dfs)

P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

城市街道交费系统最近创立了。一辆汽车左转一次需付费 11 ,右转一次需付费 55 。只有当前进、左转、右转都无路可走的时候,调头才是允许的,调头每次付费 1010 。

给出一张城市地图,要求你求出从起始点到达终止点的花费最少的路径。幸运的是,所有的道路都是正北、正南、正西或正东方向的。

  • . 表示障碍区。
  • # 表示道路。
  • E 表示起始点且汽车面朝东。
  • W 表示起始点且汽车面朝西。
  • N 表示起始点且汽车面朝北。
  • S 表示起始点且汽车面朝南。
  • F 表示终点。

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; const int N=55;
const int inf=0x3f3f3f;
int n,m,startx,starty,startflag,minn[N][N][4],ans=inf;
char map[N][N];
int disx[5]={-1,0,1,0},disy[5]={0,1,0,-1}; inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
void dfs(int x,int y,int flag,int v){
if(map[x][y]=='F'){
ans=min(ans,v);
return ;
}
if(minn[x][y][flag]<=v||ans<=v)return ;
minn[x][y][flag]=v;
bool fin=1;
/*for(int i=0;i<4;i++){
int xi=disx[i]+x,yi=disy[i]+y;
if(xi<1||xi>n||yi<1||yi>m||map[xi][yi]=='.')continue;
if(flag==i)dfs(xi,yi,flag,v),fin=0;
else if((flag+1)%4==i)dfs(xi,yi,(flag+1)%4,v+5),fin=0;
else if((flag-1+4)%4==i)dfs(xi,yi,(flag+3)%4,v+1),fin=0;
else if(fin)dfs(xi,yi,(flag+2)%4,v+10),fin=0;
}*/
//啊,对了,万一掉头的方位是0,而其他的方位是1、2、3呢?
for(int i=0;i<4;i++){
int xi=x+disx[i],yi=y+disy[i];
if(xi<1||xi>n||yi<1||yi>m||map[xi][yi]=='.')continue;
if(flag==i)dfs(xi,yi,i,v),fin=0;
}
for(int i=0;i<4;i++){
int xi=x+disx[i],yi=y+disy[i];
if(xi<1||xi>n||yi<1||yi>m||map[xi][yi]=='.')continue;
if((flag+1)%4==i)dfs(xi,yi,i,v+5),fin=0;
}
for(int i=0;i<4;i++){
int xi=x+disx[i],yi=y+disy[i];
if(xi<1||xi>n||yi<1||yi>m||map[xi][yi]=='.')continue;
if((flag+3)%4==i)dfs(xi,yi,i,v+1),fin=0;
}
if(fin){
for(int i=0;i<4;i++){
int xi=x+disx[i],yi=y+disy[i];
if(xi<1||xi>n||yi<1||yi>m||map[xi][yi]=='.')continue;
if((flag+2)%4==i)dfs(xi,yi,i,v+10),fin=0;
}
}
} int main(){
memset(minn,inf,sizeof(minn));
n=read();m=read();
for(int i=1;i<=n;i++){
scanf("%s",map[i]+1);
for(int j=1;j<=m;j++){
if(map[i][j]=='E')startx=i,starty=j,startflag=1;
else if(map[i][j]=='W')startx=i,starty=j,startflag=3;
else if(map[i][j]=='N')startx=i,starty=j,startflag=0;
else if(map[i][j]=='S')startx=i,starty=j,startflag=2;
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)cout<<map[i][j]<<" ";
cout<<endl;
}
cout<<endl;*/
dfs(startx,starty,startflag,0);
cout<<ans;
return 0;
}

2021.08.16 P1300 城市街道交通费系统(dfs)的更多相关文章

  1. 2021.08.16 P1260 工程规划(差分约束)

    2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...

  2. 2021.08.16 P1078 文化之旅(最短路)

    2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...

  3. 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)

    2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...

  4. 2021.08.06 P4392 Sound静音问题(ST表)

    2021.08.06 P4392 Sound静音问题(ST表) [P4392 BOI2007]Sound 静音问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 序列a,求 ...

  5. http://www.cnblogs.com/alipayhutu/archive/2012/08/16/2643098.html

    http://www.cnblogs.com/alipayhutu/archive/2012/08/16/2643098.html

  6. Ubuntu 16.04 LTS 64位系统 安装Docker

    本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队 ...

  7. 2021.12.16 eleveni的刷题记录

    2021.12.16 eleveni的刷题记录 1. 数论 https://www.luogu.com.cn/problem/P2532 1.1卡特兰数 https://www.luogu.com.c ...

  8. 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)

    2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...

  9. 2021.08.30 前缀函数和KMP

    2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...

随机推荐

  1. 基于WebSocket的简易聊天室

    用的是Flash + WebSocket 哦~ Flask 之 WebSocket 一.项目结构: 二.导入模块 pip3 install gevent-websocket 三.先来看一个一对一聊天的 ...

  2. dotnet 6 使用 string.Create 提升字符串创建和拼接性能

    本文告诉大家,在 dotnet 6 或更高版本的 dotnet 里,如何使用 string.Create 提升字符串创建和拼接的性能,减少拼接字符串时,需要额外申请的内存,从而减少内存回收压力 本文也 ...

  3. SQLMap参数命令

    SQLMap参数命令   --method=<http方法> 指定使用的http方法 --data=<post数据> 提交post数据并对post数据进行测试 --param- ...

  4. 罗杨老师带你了解谷歌编程之夏(GSoC)活动全流程

    罗杨老师带你了解谷歌编程之夏(GSoC)活动全流程 为了帮助同学们更好地参与开源,Casbin 决定做一期访谈节目,由小编作为一名开源初学者,用访谈的形式与北京大学工学博士.Casbin作者.Npca ...

  5. sql注入mysql注入

    #跨库查询及应用思路 information_schema表特性,记录数据库名.表名.列名对应表 information_schema.schemata:存储所有数据库名 schema_name:数据 ...

  6. Android 12(S) 图形显示系统 - 简单聊聊 SurfaceView 与 BufferQueue的关联(十三)

    必读: Android 12(S) 图形显示系统 - 开篇 一.前言 前面的文章中,讲解的内容基本都是从我们提供的一个 native demo Android 12(S) 图形显示系统 - 示例应用( ...

  7. 我们如何监视所有 Spring Boot 微服务?

    Spring Boot 提供监视器端点以监控各个微服务的度量.这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助.但是,使用监视器的一个主要缺点或困 ...

  8. 请说说你对Hibernat的理解?JDBC和Hibernate各有什么优势和劣势?

    Hibernate是一个轻量级的持久层开源框架,它是连接Java应用程序和关系数据库的中间件,负责Java对象和关系数据之间的映射.Hibernate内部对JDBC API进行了封装,负责Java对象 ...

  9. 什么是通知(Advice)?

    特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice.Spring AOP 使用一 个 Advice 作为拦截器,在 JoinPoint "周围"维护一系列 ...

  10. 读懂jstack

    1 jstack jstack是JDK自带的一种线程栈跟踪工具,用于生成java虚拟机当前时刻线程快照.在定位线程卡顿.死锁.block等原因的时候非常有用.使用方法是: jstack [-l] pi ...