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数组的一种理解思路 - 挠到头秃 - 博 ...
随机推荐
- 74CMS 3.4 反射型XSS漏洞
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.4源代码编辑使用GBK编 ...
- linux的文件与目录的权限设置
@font-face { font-family: 宋体 } @font-face { font-family: "Cambria Math" } @font-face { fon ...
- vuex组成和原理?
组成: 组件间通信, 通过store实现全局存取 修改: 唯一途径, 通过commit一个mutations(同步)或dispatch一个actions(异步) 简写: 引入mapState.mapG ...
- 利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?
ps -ef (system v 输出)ps -aux bsd 格式输出ps -ef | grep pid
- 我们如何监视所有 Spring Boot 微服务?
Spring Boot 提供监视器端点以监控各个微服务的度量.这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助.但是,使用监视器的一个主要缺点或困 ...
- vue Cannot read property ‘tapPromise‘ of undefined
https://blog.csdn.net/qq379682421/article/details/111574290 https://github.com/SimenB/add-asset-html ...
- IDEA 常用快捷键操作
自定义设置及查询: 操作路径:file-setting-Keymap-Editor actions 右击需要修改的action操作,或者右击Editor actions,选择添加Add Keyboar ...
- SpringBoot打包成可执行的Jar文件
需要时SpringBoot项目 通过创建可以在生产环境中运行的完全独立的可执行jar文件来结束示例.可执行jar(有时称为"胖jar")是包含您的已编译类以及代码需要运行的所有ja ...
- nginx 负载均衡详解
配置文件 upstream abc { server 192.168.2.188:8080 weight=1 max_fails=3 fail_timeout=30; 定义集群,weight=权重轮询 ...
- 学习Kvm(七)
六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...