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 ...
随机推荐
- windows常用快捷键(转载)
f1 显示当前程序或者windows的帮助内容. f2 当你选中一个文件的话,这意味着“重命名” f3 当你在桌面上的时候是打开“查找:所有文件” 对话框 f10或alt 激活当前程序的菜单栏 win ...
- Python之Pandas库常用函数大全(含注释)
前言:本博文摘抄自中国慕课大学上的课程<Python数据分析与展示>,推荐刚入门的同学去学习,这是非常好的入门视频. 继续一个新的库,Pandas库.Pandas库围绕Series类型和D ...
- 【BZOJ4296】[PA2015]Mistrzostwa BFS
[BZOJ4296][PA2015]Mistrzostwa Description 给定一张n个点m条边的无向图,请找到一个点数最多的点集S,满足:1.对于点集中任何一个点,它至少与d个点集中的点相邻 ...
- javascript JSON.parse和eval的区别
SON.parse()用来将标准json字符串转换成js对象:eval()除了可以将json字符串(非标准的也可以,没有JSON.parse()要求严格)转换成js对象外还能用来动态执行js代码.例如 ...
- 工作室成员 GitHub 地址集中贴(按发布时间先后排序)
金质行 https://github.com/jinxiaohang/ 金林超 https://github.com/jinlinchao/ 王贤国 https://github.com/ErhuoH ...
- DuiLib笔记之Control常用属性
name 指定控件名称,同一窗口内必须唯一,类型:STRING float 用于指定控件是否使用绝对定位,或设置FloatPercent,类型:BOOL,默认值为false,格式:float=&quo ...
- Spring 实战 学习笔记(1)
Spring的核心 依赖注入 & 切面编程 1.创建应用组件之间协作的行为通常称为装配.(wiring) 2.Spring EL表达式.SEL是一种能在运行时构建复杂表达式,存取对象属性.对象 ...
- spring4.2更好的应用事件
1.基于注解驱动事件监听器:现在可以在一个Bean的方法上使用@EventListener注解来自动注册一个ApplicationListener来匹配方法签名. @Component public ...
- Python 的枚举类型
起步 Python 中的枚举类型 Python 的原生类型中并不包含枚举类型.为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库. 枚举类型可以看作 ...
- UVA12293 Box Game —— SG博弈
题目链接:https://vjudge.net/problem/UVA-12293 题意: 两人玩游戏,有两个盒子,开始时第一个盒子装了n个球, 第二个盒子装了一个球.每次操作都将刷量少的盒子的球倒掉 ...