题意:

给你一幅图,给你起点和终点,再给你机器人所面对的方向,机器人可以左转90°,右转90°,向前进一格,每种操作都是1秒,,求起点和终点最少花费下的路径条数,方案数;

思路:

这里有一个不同就是机器人还有一个先转弯,再前进。

一开始想的是最短路,问题就是最短路计数,后来一直WA;

后来原来是写挫了,想的是最短路计数,然后写的是BFS,而且连图都没有建,直接跑spfa,也不知道在干什么。

好像最短路的话建图似乎很麻烦,而且复杂度和可行度比这个简单BFS一下低很多;

基础BFS,在一个位置,他可以左转,右转,前进,那么每次枚举状态,通过步数进行标记。

如果一个状态的步数>前一状态所到达他的步数,那么方案数=之前的方案数;

如果相等,那么就累加。

#include <bits/stdc++.h>
using namespace std;
const int INF=0x7f7f7f7f;
const int N=1e3+10;
char s[N][N];
int sx,sy,ex,ey; struct asd{
int x,y;
int flag;
}; int dx[4]={1,-1,0,0}; // S N E W
int dy[4]={0,0,1,-1};
int mod;
int n,m;
bool vis[N][N][4];
int num[N][N][4];
int ans[N][N][4]; int check(char x)
{
if(x=='S') return 0;
if(x=='N') return 1;
if(x=='E') return 2;
if(x=='W') return 3;
}
queue<asd>q; void init()
{
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
memset(num,-1,sizeof(num));
memset(ans,0,sizeof(ans));
} bool Judge(int xx,int yy)
{
if(xx<0||yy<0||xx>=n||yy>=m||s[xx][yy]=='*')
return 0;
return 1;
}
bool diff_dir(int x,int y)
{
if((x==0||x==1)&&(y==2||y==3))
return 1;
swap(x,y);
if((x==0||x==1)&&(y==2||y==3))
return 1;
return 0;
} void bfs(char x)
{
init(); asd sta;
sta.flag=check(x);
sta.x=sx;
sta.y=sy;
vis[sta.x][sta.y][sta.flag]=1;
ans[sta.x][sta.y][sta.flag]=1;
num[sta.x][sta.y][sta.flag]=0;
q.push(sta); asd now,next;
while(!q.empty())
{
now=q.front();q.pop();
for(int i=0;i<4;i++)
{
if(diff_dir(i,now.flag))
{
if(num[now.x][now.y][i]==-1)
{
num[now.x][now.y][i]=num[now.x][now.y][now.flag]+1;
ans[now.x][now.y][i]=ans[now.x][now.y][now.flag];
next=now;
next.flag=i;
q.push(next);
}
else if(num[now.x][now.y][i]==num[now.x][now.y][now.flag]+1)
ans[now.x][now.y][i]=(ans[now.x][now.y][i]+ans[now.x][now.y][now.flag])%mod;
}
}
next.x=now.x+dx[now.flag];
next.y=now.y+dy[now.flag];
next.flag=now.flag;
if(Judge(next.x,next.y))
{
if(num[next.x][next.y][now.flag]==-1)
{
num[next.x][next.y][next.flag]=num[now.x][now.y][now.flag]+1;
ans[next.x][next.y][next.flag]=ans[now.x][now.y][now.flag];
q.push(next);
}
else if(num[next.x][next.y][next.flag]==num[now.x][now.y][now.flag]+1)
ans[next.x][next.y][next.flag]=(ans[next.x][next.y][next.flag]+ans[now.x][now.y][now.flag])%mod;
}
}
int temp=INF;
int res=0;
for(int i=0;i<4;i++)
{
if(num[ex][ey][i]!=-1)
{
if(temp>num[ex][ey][i])
temp=num[ex][ey][i];
}
}
if(temp==INF)
{
puts("-1");
return;
}
for(int i=0;i<4;i++)
{
if(temp==num[ex][ey][i])
res=(res+ans[ex][ey][i])%mod;
}
printf("%d\n",res);
}
int main()
{
int cas=1;
while(~scanf("%d%d%d",&n,&m,&mod))
{
if(!mod)
break;
for(int i=0;i<n;i++)
scanf("%s",s[i]);
char x;
scanf("%d %d %d %d %c",&sx,&sy,&ex,&ey,&x);
printf("Case %d: %d ",cas++,mod);
bfs(x);
}
return 0;
}

HDU4166【BFS】的更多相关文章

  1. 【bfs】抓住那头牛

    [题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...

  2. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  3. 【bfs】Knight Moves

    [题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...

  4. 【bfs】1252 走迷宫

    [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  5. 【bfs】献给阿尔吉侬的花束

    [题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...

  6. 【bfs】迷宫问题

    [题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ...

  7. 【bfs】仙岛求药

    [题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...

  8. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

    最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...

  9. poj3278-Catch That Cow 【bfs】

    http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

随机推荐

  1. 图像处理之增强---图像增强算法四种,图示与源码,包括retinex(ssr、msr、msrcr)和一种混合算法

    申明:本文非笔者原创,原文转载自:http://blog.csdn.net/onezeros/article/details/6342661 两组图像:左边较暗,右边较亮 第一行是原图像,他们下面是用 ...

  2. ios 博客集合

    ryantang03     http://blog.csdn.net/ryantang03/article/category/1073221 kmyhy   http://blog.csdn.net ...

  3. ECMAscript 没有对该方法进行标准化,因此反对使用它。 es 日期格式化

    JavaScript substr() 方法 http://www.w3school.com.cn/jsref/jsref_substr.asp 注释:substr() 的参数指定的是子串的开始位置和 ...

  4. 无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护

    golang/goroutine 和 swoole/coroutine 协程性能测试对比 - Go语言中文网 - Golang中文社区 https://studygolang.com/articles ...

  5. java之折半查找

    //功能:二分查找import java.util.*; public class Demo1 { public static void main(String[] args) { int arr[] ...

  6. 关于JavaScript的事件触发

    突然知道JavaScript底层是怎么实现事件触发的,找到一个博客,功力不够,看的很迷糊,记载这里吧,后面再研究. [探讨]javascript事件机制底层实现原理

  7. 分布式版本控制系统—git命令

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  8. python把字典写入excel之一例

    直接上代码: # -*- coding: utf-8 -*- import xlsxwriter #生成excel文件 def generate_excel(expenses): workbook = ...

  9. NSMutableURLRequest,在POST方式下传递参数

    1. [代码][C/C++]代码         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];     NSUs ...

  10. smarty模板引擎基础(二)

    smarty模板引擎所需文件夹共可分为存放页面缓存的(cache).存放配置文件的(configs).存放模板扩充插件的(plugins).存放模板文件的(templates).存放编译后的模板文件的 ...