HDU4166【BFS】
题意:
给你一幅图,给你起点和终点,再给你机器人所面对的方向,机器人可以左转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】的更多相关文章
- 【bfs】抓住那头牛
[题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
- 【bfs】1252 走迷宫
[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...
- 【bfs】献给阿尔吉侬的花束
[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ...
- 【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, }; 它表示一个迷 ...
- 【bfs】仙岛求药
[题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...
- 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz
最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...
- poj3278-Catch That Cow 【bfs】
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
随机推荐
- JavaScript中批量设置Css样式
设置 input 元素的 属性: document.getElementsByTagName("INPUT")[0].setAttribute("属性",&q ...
- 使用 HttpWebRequest 向网站提交数据
HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互. HttpWebRequest 对 HTTP 协议进行 ...
- iOS中从零開始使用protobuf
让我们一起打开以下这个链接 https://github.com/alexeyxo/protobuf-objc 在github上有protobuf-objc,当中的readme能够教会我们安装prot ...
- 我在开发第一个Swift App过程中学到的四件事
本文转载至 http://www.itjhwd.com/wzkfyigeswiftsjs/ 译者注:本文作者Greg Heo,这是他为讲授iOS 8 App Extensions视频教程而实际使用Sw ...
- XML 解析错误:找不到根元素
大家在开发web项目的过程中,可能会遇到“XML 解析错误:找不到根元素”这么一个问题,引起这个问题的原因可能有很多种,在这儿我只是跟大家分享一下我遇到一种情况. 1.项目背景描述 extjs 结合a ...
- Mixtures of Gaussians and the EM algorithm
http://cs229.stanford.edu/ http://cs229.stanford.edu/notes/cs229-notes7b.pdf
- socket基本使用
UDP发送和接收 MainRecv.cpp #include <iostream> #include <WinSock2.h> #include <sstream> ...
- C++ ini解析器
在gitee上找到的一个很好用的ini文件解析器,纯C++代码,移植方便. 项目地址:https://gitee.com/sollyu/IniParser 稍微修改了下,去掉了Windows平台相关定 ...
- div和span、relative和absolute、display和visibility的区别
一.div和span的区别 div是一个块级元素,可以包含段落,表格等内容,用于放置不同的内容.一般我们在网页通过div来布局定位网页中的每个区块. span是一个内联元素,没有实际意义,它的存在纯粹 ...
- UVA10870 Recurrences —— 矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-10870 题意: 典型的矩阵快速幂的运用.比一般的斐波那契数推导式多了几项而已. 代码如下: #include <bit ...