2021.08.16 P1300 城市街道交通费系统(dfs)
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)的更多相关文章
- 2021.08.16 P1260 工程规划(差分约束)
2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...
- 2021.08.16 P1078 文化之旅(最短路)
2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...
- 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)
2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...
- 2021.08.06 P4392 Sound静音问题(ST表)
2021.08.06 P4392 Sound静音问题(ST表) [P4392 BOI2007]Sound 静音问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 序列a,求 ...
- http://www.cnblogs.com/alipayhutu/archive/2012/08/16/2643098.html
http://www.cnblogs.com/alipayhutu/archive/2012/08/16/2643098.html
- Ubuntu 16.04 LTS 64位系统 安装Docker
本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队 ...
- 2021.12.16 eleveni的刷题记录
2021.12.16 eleveni的刷题记录 1. 数论 https://www.luogu.com.cn/problem/P2532 1.1卡特兰数 https://www.luogu.com.c ...
- 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)
2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...
- 2021.08.30 前缀函数和KMP
2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...
随机推荐
- 和风天气WebApi使用教程
1.首先进入和风天气开发平台,点击右上角的注册进行注册 和风天气开发平台 2.填写注册用的邮箱和密码完成注册,可能还需要手机号,按提示注册完成即可. 3.从和风天气开发平台右上角进入控制台,输入你刚刚 ...
- sum 函数语法与应用
一.sum 函数语法: SELECT SUM(expression ) FROM tables WHERE predicates; expression 常量.列或函数,或者是算术.按位与字 ...
- 统计分析— 1.SPSS数据编辑窗口 输出窗口 语法窗口
第一课-SPSS窗口 一 数据编辑窗口(Data Editor) 二 输出窗口(Output Viewer ) 三 语法窗口(Syntax Editor):针对中高级用户,有些操作可以通过输入代码的方 ...
- Nacos配置中心集群原理及源码分析
Nacos作为配置中心,必然需要保证服务节点的高可用性,那么Nacos是如何实现集群的呢? 下面这个图,表示Nacos集群的部署图. Nacos集群工作原理 Nacos作为配置中心的集群结构中,是一种 ...
- Java中的序列化Serialable
Java中的序列化Serialable https://blog.csdn.net/caomiao2006/article/details/51588838
- JDBC中的Statement 和PreparedStatement的区别?
PreparedStatement是预编译的SQL语句,效率高于Statement. PreparedStatement支持操作符,相对于Statement更加灵活. PreparedStatemen ...
- 什么是openssl?
在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服务器上.
- java中的ThreadLocal-learning
为什么需要ThreadLocal 多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性. 而线程安全是指 当多个线程访问某个方法时 ...
- Serlvet 输出中文
1 response.setHeader("Content-type", "text/html;charset=UTF-8"); 2 response.setC ...
- mysql 的INNODB引擎和MYISAM引擎的区别、索引相关
两个引擎都是使用B+tree 数据结构作为索引 不同点: 1.INNODB的主键必须要有,同时也是聚集索引,INNODB的数据文件本身就是索引文件:而MYISAM则是存储了数据的地址 2.INNODB ...