题意:

给你一幅图,给你起点和终点,再给你机器人所面对的方向,机器人可以左转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. Android笔记之manifestPlaceholders

    有时根据项目需要,AndroidManifest.xml中的meta-data的值分测试和正式 为了能自动地更换meta-data值,就需要用到manifestPlaceholders 语法:mani ...

  2. [Spring Batch 系列] 第一节 初识 Spring Batch

    距离开始使用 Spring Batch 有一段时间了,一直没有时间整理,现在项目即将完结,整理下这段时间学习和使用经历. 官网地址:http://projects.spring.io/spring-b ...

  3. (转)windows下一分钟配置ngnix实现HLS m3u8点播

    一.首先保证nginx能正常运行:          这个就是因为前面我们把nginx的目录加到了Path中,然而nginx启动时各种路径都是以当前工作目录为起始点的,这就导致了系统去“C:\User ...

  4. NSString和NSMutableNSString的基本用法

    // // main.m // NSString /** NSString 1.NSString 是一个不可以变的字符串对象 2.NSMutableString是一个可变字符串. 下面代码为字符串的: ...

  5. JavaWeb项目里面的路径获取方法总结

    仅为资源搬运,个人还未充分理解... request.getRealPath不推荐使用request.getRealPath("") 这个方法已经不推荐使用了 request.ge ...

  6. 第三篇:python基础之数据类型与变量

    阅读目录 一.变量 二.数据类型 2.1 什么是数据类型及数据类型分类 2.2 标准数据类型: 2.2.1 数字 2.2.1.1 整型: 2.2.1.2 长整型long: 2.2.1.3 布尔bool ...

  7. yii中调取字段名称时label与labelEx的区别

    $form = $this->beginWidget('CActiveForm',array('id' => 'userRegisterForm')); echo $form->la ...

  8. 关于使用response.addHeader下载中文名乱码问题

    介绍下我项目中遇到的问题:在数据库导出Excel文件的过程中,导出文件中文名始终异常,最终结果发现需要在response.addHeader 中的 filename = "xxxx" ...

  9. PIL数据和numpy数据的相互转换

    在做图像处理的时候,自己常用的是将PIL的图片对象转换成为numpy的数组,同时也将numpy中的数组转换成为对应的图片对象. 这里考虑使用PIL来进行图像的一般处理. from PIL import ...

  10. JavaScript实现按键记录,并在关掉网页之前把记录的内容post出去

    最近陈老师让我给新架构加一个按键记录的业务.去学习了JavaScript,网上找了一些代码,最后写出来了: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...