Problem 38: bench与奔驰

Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:2

Description

公园里有个人在练开奔驰 - -!,但是总是撞在bench上 (众人曰:狼来了,快跑啊!)
公园里的bench与奔驰都是无敌的,不会被撞坏。
由于开奔驰的人比较"有特点",总是向上下左右四个方向开,而且只会在撞到椅子之后改变方向(起步时除外) - -!
现在他给你一张地图,上面标明 他的位置 、 公园里的bench的位置 和 他想到达的位置,可能会有冲出地图的可能
请你告诉他最少撞多少下才能到达目的地,并答应事成之后会给你一辆奔驰..............................................的照片

Input

第一行,两个数,分别表示地图的行和列,都不大于50
以下是地图,"."表示地面,"S"表示起点,"E"表示终点,"B"表示bench(什么意思呢?)
保证只有一个终点和一个起点,并不会出现其他字符

Output

第一行,表示他能不能到达目的地。如果能,就输出"Yes"。否则,输出"No"
如果能到达目的地,就在第二行输出最少的撞击次数

Sample Input

测试数据1:
5 5
BBBBB
B...B
BSE.B
B...B
BBBBB

测试数据2:
3 3
S..
...
..E

Sample Output

测试数据1:
Yes
0

测试数据2:
No

Hint

测试数据1:点火后直接向右走
测试数据2:四个方向都会冲出地图

注意:可能冲出地图,或者永远无法到达。
起初打算用bfs,提交之后超时,估计陷入死循环,不该访问的点多次访问。
后来采用dfs,终于过了
感觉这个题与poj的冰壶类似,不过冰壶碰到障碍物,障碍物会消失,也就是说冰壶可以在
暂停的位置向任意一个方向走(可以原路返回),但是这个题障碍物是无敌的,所以每次停下后,
下次只能向其他两个方向前进(不包括当前前进的方向,和反向),因此每次前进都要判断想那个方向,
还有,要把每次转换方向的点标记(标记为X不标记为B,原因是与障碍物区分出来),以防止陷入死循环,比如
BBBBB
BB..B
B.S.B
BE..B
BBBBB
如果从S出发向下->向右->向上->向左->向下。。。。。,就发生了死循环(如果不标记每个转向点)。
题目说:如果找到就要输出最小转向次数,所以要把所有的可能都找出来,选择最小的,不能找到就退出。

#include <stdio.h>
#include <memory.h>char map[54][54];
char dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};int w, h, sx, sy, minstep;
bool flag;void dfs(int x, int y, int d, int step)
{int i, nx, ny;for (i=0; i<4; ++i){if (d == i)continue;if (d == 0 && i==1)continue;if (d == 1 && i == 0)continue;if (d == 2 && i == 3)continue;if (d == 3 && i == 2)continue;nx = x + dir[i][0];ny = y + dir[i][1];if (map[ny][nx] == 1 || map[ny][nx] == 'B')continue;while (map[ny][nx] == '.'){nx += dir[i][0];ny += dir[i][1];}if (map[ny][nx] == 'E'){flag = true;if (minstep > step)minstep = step;continue;}if (map[ny][nx] == 1)continue;if (map[ny][nx] == 'X')continue;nx -= dir[i][0];ny -= dir[i][1];map[ny][nx] = 'X';dfs(nx, ny, i, step+1);map[ny][nx] = '.';}
}int main()
{scanf("%d %d", &h, &w);getchar();int i, j;memset(map, 1, sizeof(map));for (i=1; i<=h; ++i){for (j=1; j<=w; ++j){scanf("%c", &map[i][j]);if (map[i][j] == 'S'){sx = j;sy = i;map[i][j] = 'X';}}getchar();}flag = false;minstep = 2000000000;dfs(sx, sy, -1, 0);if (flag)printf("Yes\n%d\n", minstep);elseputs("No");return 0;
}

oj betch与奔驰相关推荐

  1. 竞争神经网络 python_用python解决kaggles奔驰环保竞争

    竞争神经网络 python Part 2 - Validation, Hyperparameter Tuning, and Feature Selection 第2部分-验证,超参数调整和特征选择 介 ...

  2. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB 提交: 475  解决: 34 提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如 ...

  3. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  4. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  5. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  6. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  7. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  8. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

  9. 【ACM】杭电OJ 1003。

    运行环境VS2017  题目链接:杭电OJ 1003 主要思想是: 用d[i]来存放前i项中最大的和,得到end,然后再倒推,得起始的位置begin 然而在程序42行的疑问,大家可以讨论一下吗???? ...

最新文章

  1. 2018-2019年新一代AI领域十大最具成长性技术展望
  2. spark mllib 预测之LinearRegression(线性回归)
  3. 如何取消或定制当点击GridView 的时候出现的那个黄色背景
  4. JavaScript window
  5. opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核
  6. ast.literal_eval
  7. java string.interned_Java中的字符串表示形式
  8. php 怎么查看文件类型信息,php获取文件类型和文件信息的方法
  9. 【每周一本书】之《解码者:艾伦·图灵传》:解码计算机之父、人工智能奠基者的谜样人生
  10. kotlin插件禁用导致的Android studio无法打开-mac
  11. Java中的getBytes()方法详解
  12. 360主机卫士linux安装软件,360主机卫士linux版|360主机卫士 for Linux v0.5.7官方版 - 121下载站...
  13. 中餐菜单分类名称创意_餐厅菜单的种类分类
  14. 支付宝第三方支付保证数据的安全性
  15. 没有参加职工养保不要紧,城乡居民基本养老保险了解一下~
  16. 麒麟系统打印机连接服务器,麒麟桌面操作系统集成“麒麟云打印”,可解决打印机兼容问题...
  17. 贪吃蛇游戏 C语言程序设计
  18. security+真的没有那么难考,我的信息安全分享
  19. 电力窃漏电用户自动识别的实验报告
  20. jdk11新特性,是否有必要从JDK8切换到JDK11

热门文章

  1. android搜索热词(热门标签)流式布局的实现
  2. Java-Fizzbuzz
  3. 论文书写漫谈观后笔记
  4. 直播平台开发,验证码工具类
  5. 【半监督医学图像分割 2022 CVPR】S4CVnet 论文翻译
  6. JAVA编程思想--接口
  7. c语言运算符 %3c%3c4,C语言学习笔记二---数据类型运算符与表达式
  8. Java岗面试:java开发是什么职业
  9. 高并发秒杀系统架构设计 · 抢购、微信红包、一元夺宝
  10. 谷哥翻译,你敢随随便便相信吗?