题目
Description
考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了’x’。
例如下图:

. . B x .
. x x A .
. . . x .
. x . . .
. . x . .

贝茜发现自己恰好在点A出,她想去B处的盐块添盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。
Input

行 1: 一个整数 N
行 2…N + 1: 行 i+1 有 N 个字符 (’.’, ‘x’, ‘A’, ‘B’),表示每个点的状态。
Output
行 1: 一个整数,最少的转弯次数。
Sample Input
3
.xA

Bx.
Sample Output
2
思路
听说这道题用暴搜+玄学的dir数组顺序可以AC但是我没试过
正解:BFS加一点记忆化。
而且需要注意的是,最短路径不代表最少转弯次数,后搜到的反而可能更优,当然也可能不,所以就需要添加记忆化搜索;
记忆化:用f[i][j][k]表示在(i,j)朝向方向k(0-3分别代表一个方向),每次改变k进行搜索,最后输出以终点为坐标,朝向四个方向的转弯次数的最小值就可以了。过程中打标记的vis数组也要开成三维的,不然不方便标记。

代码

 #include<bits/stdc++.h>
using namespace std;
int n,sx,sy,tx,ty,ans=0x3f3f3f3f;
char a[][],s[];
int f[][][],dx[]={,,,-},dy[]={,-,,};
bool vis[][][];
// 0 1 2 3
//右 左 上 下
struct node
{
int x,y,dir;
};
queue <node> q;
int min_(int a,int b,int c,int d)
{
if (a>b) a=b;
if (a>c) a=c;
if (a>d) a=d;
return a;
}
void init()
{
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
f[i][j][k]=0x3f3f3f3f;
f[sx][sy][]=;
f[sx][sy][]=;
f[sx][sy][]=;
f[sx][sy][]=;
vis[sx][sy][]=;
vis[sx][sy][]=;
vis[sx][sy][]=;
vis[sx][sy][]=;
q.push((node){sx,sy,});
q.push((node){sx,sy,});
q.push((node){sx,sy,});
q.push((node){sx,sy,}); }
bool not_in(int x,int y)
{
return x<||x>n||y<||y>n||a[x][y]=='x';
}
void bfs()
{
init();
while(!q.empty())
{
node now=q.front();
q.pop();
vis[now.x][now.y][now.dir]=false;
for (int i=;i<;i++)
{
int x=now.x+dx[i],y=now.y+dy[i];
if(not_in(x,y))continue;
int l;
if(i==now.dir)l=;
else l=;
if (f[x][y][i]>f[now.x][now.y][now.dir]+l)
{
f[x][y][i]=f[now.x][now.y][now.dir]+l;
if(!vis[x][y][i])
vis[x][y][i]=,q.push((node){x,y,i});
}
}
}
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]=='A')sx=i,sy=j;
if(a[i][j]=='B')tx=i,ty=j;
}
}
bfs();
ans=min_(f[tx][ty][],f[tx][ty][],f[tx][ty][],f[tx][ty][]);
if(ans!=0x3f3f3f3f)
cout<<ans<<endl;
else cout<<-<<endl;
return ;
}

【题解】[USACO2007 OCT]Obstacle Course-C++的更多相关文章

  1. BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    题目 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MB Description 考虑一 ...

  2. 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved ...

  3. BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课( BFS )

    BFS... 我连水题都不会写了QAQ ------------------------------------------------------------------------- #inclu ...

  4. bzoj1644 [Usaco2007 Oct]Obstacle Course 障碍训练课

    Description 考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场.有些方格是奶牛们不能踏上的,它们被标记为了'x'.例如下图: . . B x . ...

  5. 【BZOJ】1644: [Usaco2007 Oct]Obstacle Course 障碍训练课(bfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1644 这和原来一题用dp来做的bfs很像啊orz.. 我们设f[i][j][k]代表i,j这个点之前 ...

  6. bzoj 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课【spfa】

    洛谷的数据毒啊 把(i,j,k)作为一个点spfa,表示点(i,j)朝向k方向,然后向四个方向转移即可 #include<iostream> #include<cstdio> ...

  7. BZOJ1709: [Usaco2007 Oct]Super Paintball超级弹珠

    1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 324  Solved: ...

  8. BZOJ1708: [Usaco2007 Oct]Money奶牛的硬币

    1708: [Usaco2007 Oct]Money奶牛的硬币 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 513  Solved: 329[Submi ...

  9. 1709: [Usaco2007 Oct]Super Paintball超级弹珠

    1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 339  Solved:  ...

随机推荐

  1. 堆学习笔记(未完待续)(洛谷p1090合并果子)

    上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...

  2. Python基础 第5章 条件、循环及其他语句(1)

    1. print和import 1.1 打印多个参数 可用 + 连接多个字符串,可保证被连接字符串前无空格: 可用sep=“_”,自定义各种分隔符: print("I"," ...

  3. YAML 语言格式

    1. 认识 YAML YAML(Yet Another Markup Language)语言(发音 /ˈjæməl/ )是一个类似 XML.JSON 的标记性语言.YAML 强调以数据为中心,并不是以 ...

  4. (二十九)JSP之国际化

    导入 <%@ taglib url="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 创建三个语 ...

  5. (十)web服务与javaweb结合(1)

    一.解决方法 A . 编写一个监听器,在监听器中发布服务 二.案例一 方法A:编写一个监听器,在监听器中发布服务 1. 编写服务接口 package com.shyroke.service; impo ...

  6. Java数据结构ArrayList

    Java数据结构ArrayList /** * <html> * <body> * <P> Copyright JasonInternational</p&g ...

  7. 远程调用cmd更新本地jar

    最近遇到一个项目需求需要实现远程更新,但是本地项目无法更新自己,这让博主很是头疼,既然自己无法更新自己的话,那就自建新的项目,通过本地项目来调用新项目接口来更新本地项目. 代码如下: /** * 重启 ...

  8. shell code

  9. Kubernetes的核心技术概念和API对象

    Kubernetes的核心技术概念和API对象 API对象是K8s集群中的管理操作单元.K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作.例如副本集 ...

  10. 【转】PS1应用-修改linux终端命令行字体颜色

    原文链接:https://www.jianshu.com/p/4239d3ea72fe cd ls -la vim .bashrc 在.bashrc中加入这一行: PS1="\[\e[37; ...