题目描述

Consider an N x N (1 <= N <= 100) square field composed of 1

by 1 tiles. Some of these tiles are impassible by cows and are marked with an 'x' in this 5 by 5 field that is challenging to navigate:

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

Bessie finds herself in one such field at location A and wants to move to location B in order to lick the salt block there. Slow, lumbering creatures like cows do not like to turn and, of course, may only move parallel to the edges of the square field. For a given field, determine the minimum number of ninety degree turns in any path from A to B. The path may begin and end with Bessie facing in any direction. Bessie knows she can get to the salt lick.

N*N(1<=N<=100)方格中,’x’表示不能行走的格子,’.’表示可以行走的格子。卡门很胖,故而不好转弯。现在要从A点走到B点,请问最少要转90度弯几次?

输入输出格式

输入格式:

第一行一个整数N,下面N行,每行N个字符,只出现字符:’.’,’x’,’A’,’B’,表示上面所说的矩阵格子,每个字符后有一个空格。

【数据规模】

2<=N<=100

输出格式:

一个整数:最少转弯次数。如果不能到达,输出-1。

输入输出样例

输入样例#1:

3
. x A
. . .
B x .
输出样例#1:

2

说明

【注释】

只可以上下左右四个方向行走,并且不能走出这些格子之外。开始和结束时的方向可以任意。

  1//我用的DFS,他们说dfs做不出来,但我做出来了QWQ 
#include<bits/stdc++.h>
using namespace std;
int read()
{
int ret=,ok=;char ch=getchar();
while(ch<''||ch>'') {if(ch=='-')ok=-;ch=getchar();}
for(;ch>=''&&ch<='';ch=getchar()) ret=ret*+ch-'';
return ret*ok;
}
int n;
char a[][];
int ans[][];
bool vis[][],sea[][];
int bx[]={-,,,};
int by[]={,,-,};
inline void dfs(int sx,int sy)
{
sea[sx][sy]=true;
if(sx>n || sy>n || sy<= || sx<=)
return;
vis[sx][sy]=;
for(int i=sx+;i<=n;i++)
{
if(a[i][sy]=='x')
break;
if(ans[i][sy]>ans[sx][sy]+)
{
ans[i][sy]=ans[sx][sy]+;
dfs(i,sy);
}
vis[i][sy]=true;
}
for(int i=sx-;i>=;i--)
{
if(a[i][sy]=='x')
break;
if(ans[i][sy]>ans[sx][sy]+)
{
ans[i][sy]=ans[sx][sy]+;
dfs(i,sy);
}
vis[i][sy]=true;
}
for(int i=sy+;i<=n;i++)
{
if(a[sx][i]=='x')
break;
if(ans[sx][i]>ans[sx][sy]+)
{
ans[sx][i]=ans[sx][sy]+;
dfs(sx,i);
}
vis[sx][i]=true;
}
for(int i=sy-;i>=;i--)
{
if(a[sx][i]=='x')
break;
if(ans[sx][i]>ans[sx][sy]+)
{
ans[sx][i]=ans[sx][sy]+;
dfs(sx,i);
}
vis[sx][i]=true;
}
for(int i=;i<=;i++)
{
int nx=sx+bx[i];
int ny=sy+by[i];
if(nx>n || ny>n || ny<= || nx<=)
continue;
if(vis[nx][ny] && !sea[nx][ny])
{
sea[nx][ny]=;
dfs(nx,ny);
}
}
}
int main()
{
int sx,sy;
int lx,ly;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ans[i][j]=; //这一步赋值很关键!之前用memset赋0x7f,会错一个点
n=read();
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;
ans[i][j]=-;
}
if(a[i][j]=='B')
{
lx=i;
ly=j;
}
}
dfs(sx,sy);
if(ans[lx][ly]==)
{
cout<<-<<endl;
return ;
}
cout<<ans[lx][ly]<<endl;
return ;
}

Luogu P1649 [USACO07OCT]障碍路线Obstacle Course的更多相关文章

  1. bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course

    P1649 [USACO07OCT]障碍路线Obstacle Course bfs 直接上个bfs 注意luogu的题目和bzoj有不同(bzoj保证有解,还有输入格式不同). #include< ...

  2. 洛谷 P1649 [USACO07OCT]障碍路线Obstacle Course

    P1649 [USACO07OCT]障碍路线Obstacle Course 题目描述 Consider an N x N (1 <= N <= 100) square field comp ...

  3. P1649 [USACO07OCT]障碍路线Obstacle Course

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

  4. 洛谷P1649 【[USACO07OCT]障碍路线Obstacle Course】

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

  5. [USACO07OCT]障碍路线Obstacle Course

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

  6. 障碍路线Obstacle Course

    P1649 [USACO07OCT]障碍路线Obstacle Course 裸的dfs,今天学了一个新招,就是在过程中进行最优性减枝. #include<bits/stdc++.h> us ...

  7. [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解

    题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...

  8. 2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS)

    2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS) 题意: 给一张n*n的图,起点为A,终点为 B,求从A到B转弯次数最少为多少. 分析: 是否存在 ...

  9. [洛谷1649]障碍路线<BFS>

    题目链接:https://www.luogu.org/problem/show?pid=1649 历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾: 这是一道很明显的BFS,然 ...

随机推荐

  1. C# 文字转换最简单的方法

    引用Microsoft.VisualBasic string text=Strings.StrConv("需要转换的文字", VbStrConv.TraditionalChines ...

  2. struts2框架下的一个简单的ajax例子

    举个例子 jsp页面: <%@ page language="java" import="java.util.*" pageEncoding=" ...

  3. HTML form表单小结

    HTML form标签小结 最近研究 form标签,有一些小心得写下来与大家分享分享,共勉.在小结的最后有一个form表单的小例子,可以作为参考. -----DanlV form是HTML的一个极为重 ...

  4. python编程快速上手之第9章实践项目参考答案

    本章介介绍了shutil,zipfile模块的使用,我们先来认识一下这2个模块吧. 一.shutil模块 shutil模块主要用于对文件或文件夹进行处理,包括:复制,移动,改名和删除文件,在shuti ...

  5. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  6. App的前后台数据同步

    前言 在开发一个点餐软件时,app的订单数据是使用本地Sqlite数据库,在提交订单数据后,当订单数据在后台(Mysql数据库)发生变化时(如:已买单),本地数据如何改变呢? 思路 前台在查询时,将后 ...

  7. Spring3中@Value注解的使用

    Spring可以通过@Value注解来直接获取properties文件里面配置的值. 1. 首先要在spring的配置文件中指明properties文件的位置: <context:propert ...

  8. Java并发编程深入学习

    上周的面试中,被问及了几个并发开发的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,该书内容主要是对ifev ...

  9. UVa455 Periodic String 的wronganswer问题探讨,以及AC的新思路

    题目的意思是一个字符串有某个长度为k的字符串通过不断重复形成的,而k被称为该字符串的周期.而我们所要做的是找出该字符串的最小周期. input The first line is an integer ...

  10. 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...