5793. 【NOIP2008模拟】小S练跑步 
(File IO): input:run.in output:run.out

Time Limits: 2000 ms  Memory Limits: 524288 KB  Detailed Limits  

Goto ProblemSet

Description

       小S是一个爱锻炼的孩子,他在放假期间坚持在A公园练习跑步。
      但不久后,他就开始为在重复的地点练习感到厌烦了,他就打算去B公园跑步。
      但是小S由于没有去过B公园,他不知道B公园是否适合练习跑步,又不知道在B公园怎样跑是最优的。所以小S就去B公园进行了一番勘测。
      小S在进行了一番勘测后,画出了一张地图,地图每一个位置上都辨识了小S到达该位置后不能往哪一个方位移动。其中有5种表示的符号:“U”代表不能向上移动,“D”代表不能向下移动,“L”代表不能向左移动,“R”代表不能向右移动,如果该位置有障碍物,小S到达那里后无法继续训练,就用“S”来代表。整个公园共有n行m列,小S会从第1行第1列出发,到第n行第m列结束他的练习。
      现在小S想要知道,从起点(即第1行第1列)到终点(第n行第m列),途中最少要改变几次方向(即上一次移动的方向和这一次移动的方向不一样)?
      注意:小S如在训练途中离开公园(即地图范围),则算是结束训练。
 

Input

      第1行两个整数n和m,它们的定义请看【题目描述】。
      第2~n+1行,每行有m个字符,表示小S的移动方向。

Output

      如果小S从第1行第1列出发无论如何都到达不了第n行第m列,输出“No Solution”,否则输出小S途中最少要改变方向的次数。
 
 

Sample Input

3 3
ULL
LDU
SUD

Sample Output

1

【样例解释】
      小S先向右移动移动了2格,再向下移动2格,就到达了终点,这样只用改变一次方向。
 
 
 

Data Constraint

【数据范围限制】
 
10%的数据是题目的馈赠。
30%的数据,1≤n,m≤10。
50%的数据,1≤n,m≤50。
70%的数据,1≤n,m≤250。
100%的数据,1≤n,m≤500.
其中50%的数据是先构造出路径,再构造地图的。
100%数据是随机构造的。
 
做法:纯粹的暴力╮(╯_╰)╭,考验代码能力。。。
 
这里给出一个比较丑的打法,跑了1500ms,看到有人跑了50ms。。
代码如下:
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#define M 507
using namespace std;
int n, m, map[M][M], dis[M][M][], list[][];
string s;
int dy[] = {, , , -, };
int dx[] = {, -, , , }; void init()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
{
cin >> s;
for (int j = ; j < m; j++)
{
if (s[j] == 'U') map[i][j + ] = ;
if (s[j] == 'D') map[i][j + ] = ;
if (s[j] == 'L') map[i][j + ] = ;
if (s[j] == 'R') map[i][j + ] = ;
if (s[j] == 'S') map[i][j + ] = ;
}
}
} bool check(int x, int y, int w, int to)
{
if (map[x][y] == &&(x != n || y != m)) return ;
if (x > n || x < ) return ;
if (y > m || y < ) return ;
if (to >= dis[x][y][w]) return ;
if (to >= dis[x][y][] + ) return ;
dis[x][y][] = min(dis[x][y][], to);
dis[x][y][w] = to;
return ;
} void Bfs()
{
int head = , tail = ;
memset(dis, 0x7f7f7f7f, sizeof(dis));
dis[][][] = ;
dis[][][] = ;
dis[][][] = ;
dis[][][] = ;
for (int i = ; i <= ; i++)
if (map[][] != i)
{
list[++tail][] = ;
list[tail][] = ;
list[tail][] = i;
}
while (head < tail)
{
int u = list[++head][], v = list[head][], now = list[head][], val = list[head][];
for (int i = ; i <= ; i++)
if (map[u][v] != i)
{
int ain_u = u + dx[i], ain_v = v + dy[i];
int W = val;
if (now != i) W++;
if (!check(ain_u, ain_v, i, W)) continue;
list[++tail][] = ain_u;
list[tail][] = ain_v;
list[tail][] = i;
list[tail][] = W;
}
}
int ans = 0x7f7f7f7f;
for (int i = ; i <= ; i++)
ans = min(ans, dis[n][m][i]);
if (ans == 0x7f7f7f7f) printf("No Solution");
else printf("%d", ans);
} int main()
{
freopen("run.in", "r", stdin);
freopen("run.out", "w", stdout);
init();
Bfs();
}

JZOJ 5793. 【NOIP2008模拟】小S练跑步的更多相关文章

  1. JZOJ 5777. 【NOIP2008模拟】小x玩游戏

    5777. [NOIP2008模拟]小x玩游戏 (File IO): input:game.in output:game.out Time Limits: 1000 ms  Memory Limits ...

  2. JZOJ 5776. 【NOIP2008模拟】小x游世界树

    5776. [NOIP2008模拟]小x游世界树 (File IO): input:yggdrasil.in output:yggdrasil.out Time Limits: 1500 ms  Me ...

  3. JZOJ 5775. 【NOIP2008模拟】农夫约的假期

    5775. [NOIP2008模拟]农夫约的假期 (File IO): input:shuru.in output:shuru.out Time Limits: 1000 ms  Memory Lim ...

  4. JZOJ 5773. 【NOIP2008模拟】简单数学题

    5773. [NOIP2008模拟]简单数学题 (File IO): input:math.in output:math.out Time Limits: 1000 ms  Memory Limits ...

  5. JZOJ5776. 【NOIP2008模拟】小x游世界树

    题目:[NOIP2008模拟]小x游世界树: 题目的附加题解给的很清楚,这里只给一个代码: #include<iostream> #include<cstdio> #inclu ...

  6. JZOJ 5809. 【NOIP2008模拟】数羊

    5809. [NOIP2008模拟]数羊 (File IO): input:sheep.in output:sheep.out Time Limits: 1000 ms  Memory Limits: ...

  7. JZOJ 5791. 【NOIP2008模拟】阶乘

    5791. [NOIP2008模拟]阶乘 (File IO): input:factorial.in output:factorial.out Time Limits: 1000 ms  Memory ...

  8. JZOJ 5771. 【NOIP2008模拟】遨游

    5771. [NOIP2008模拟]遨游 (File IO): input:trip.in output:trip.out Time Limits: 2000 ms  Memory Limits: 2 ...

  9. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

随机推荐

  1. Java面向对象_常用类库api——对象比较器

    概念:对两个或多个数据项进行比较,以确定他们是否相等,或确定他们之间的大小关系及排列顺序成为比较. 1.Comparable接口: 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然 ...

  2. 牛客网Java刷题知识点之匿名对象

    不多说,直接上干货! 匿名对象的两种用途: 1.当对象对方法仅进行一次调用的时候,就可以简化成匿名对象. 2.匿名对象可以作为实际参数进行传递. 匿名对象顾名思义就是没有名字的对象. new Car( ...

  3. linux php 安装xdebug

    我的环境是PHP 5.2.5,下载的xdebug是Xdebug v2.2.1 源码包 PHP 5.3.20用的是Xdebug v2.1.0  {版本一定要匹配} 下载地址为:http://xdebug ...

  4. HDU 5445——Food Problem——————【多重背包】

    Food Problem Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  5. P1736 创意吃鱼法80

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  6. 图片单独上传 (word)

    Word.ApplicationClass wordApp=new ApplicationClass(); object file=path; object nullobj=System.Reflec ...

  7. java下的串口通信-RXTX

    关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的 ...

  8. 内置函数isNaN()

    NaN(not a number)的产生:算术运算返回一个未定义的或无法表示的值 1.NaN并不一定用于表示某些值超出表示范围的情况.将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN. ...

  9. SublimeText相关配置

    安转插件:案例格式化HTML代码,需要安装插件,具体安装步骤如下: 1.打开菜单->首选项->插件控制,输入 install package 2.等待程序进入插件管理功能,再输入插件名称: ...

  10. MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析

    MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析 注:MATLAB版本--2016a,作图分析部分见<MATLAB之折线图.柱状图.饼图以及常用绘图技巧> 一.现状模式下的模型 % ...