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. WPF使用Linq 一行代码搞定数据绑定
  2. 交叉编译 FLTK1.3.0
  3. 完整mes代码(含客户端和server端_Ice简介+Qt代码示例
  4. OpenCASCADE:调试工具和提示
  5. Comet OJ(Contest #8)-C符文能量【dp】
  6. Linux 终端下 dstat 监控工具
  7. java文件编码格式环境变量_Jenkins maven 构建乱码,修改file.encoding系统变量编码为UTF-8...
  8. pr调色预设_视频调色不好掌握?用这2000套PR、AE、达芬奇调色预设吧
  9. 问题 G: 编写函数:数组的排序 (Append Code)
  10. centos7 设置ssh免密码登录配置方法
  11. 各年龄段都是怎么提加薪的?
  12. VM Workstation 虚拟机安装Ghost XP教程
  13. 【MyBean调试笔记】接口的使用和清理
  14. 量子世界的测不准定律
  15. MFC中有关鼠标单击双击响应的问题
  16. PTA-IP地址转换
  17. 前端JS常见树——Tree
  18. java中静态方法与非静态方法的区别及非静态方法的注意事项
  19. (OK) MIMP - 18 ( 5 nodes) - 抓包-缺少 MPTCP-JION - 发现了另一个问题【M1 ping M5】不可以 ping 通
  20. 移动端避免使用100vh

热门文章

  1. 大数据AI智能—物联网世界对职业发展的影响
  2. Java POI 读取word文件
  3. ADS学习笔记—2.原理图界面
  4. 【JY】中南建筑设计院:雷神山医院设计仿真应用与设计创新那些事
  5. CVE-2018-20250 -- WinRAR远程代码执行漏洞结合Metasploit+Ngrok实现远程上线
  6. 【Spark分布式内存计算框架——Spark Core】6. RDD 持久化
  7. delve支持arm设备吗?
  8. 【半监督医学图像分割 2022 CVPR】S4CVnet 论文翻译
  9. Go语言系列-Go内建容器
  10. 普通计算机硬件cpu,DIY硬件搭配技巧:组装电脑如何搭配CPU和显卡才最合适?