一个有几个小坑的bfs

题目很长,但并不复杂,大概总结起来有这么点。

有t组输入

每组输入n, m, p。表示一个n*m的地图,每p秒按键会右移一次(这个等会儿再讲)。

然后是地图的输入。其中'@'为起点,'$'为终点,'.'为通路,'*'为不通。

问从起点到终点最少需要多久?

一眼看去,裸的bfs嘛,10*10的地图,简单!

不过还是连错4次……

注意!

每一秒有4种操作,注意,不是三种,1. 光标左移,2. 光标右移,3. 按照光标方向行走,4. 不动(尤其是这一个)。

所谓光标左移,右移,因为题目中给出了光标(在图上,共4个方向),每次改变的移动方向只能是当前光标选择的方向的左右两个。而行走只能按照光标所指的方向。

另外每过p秒,方向会变化(初始四个方向的顺序为左右上下,p秒后变成右上下左,再过p秒后变为上下左右)。

废话说完,上代码——

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; const int N = ; struct node
{
int x, y, dis, step;
}; int go[][] = {{, -}, {, }, {-, }, {, }}; int t;
int n, m, P;
char mp[N][N];
bool v[N][N];
bool vv[N][N][]; int change(int a)
{
switch(a)
{
case :
return ;
case :
return ;
case :
return ;
case :
return ;
}
} void bfs()
{
node p;
bool k = ;
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
{
if(mp[i][j] == '@')
{
p.x = i;
p.y = j;
k = ; break;
}
}
if(k) break;
}
p.dis = ;
p.step = ;
vv[p.x][p.y][] = ; queue<node> que;
que.push(p);
while(!que.empty())
{
node p = que.front();
que.pop(); int xx = p.x+go[p.dis][];
int yy = p.y+go[p.dis][];
if(xx >= && xx < n && yy >= && yy < m)
{
if(v[xx][yy] == )
{
if(mp[xx][yy] == '.')
{
v[xx][yy] = ;
node q;
q.x = xx;
q.y = yy;
q.step = p.step+;
q.dis = p.dis;
if(q.step%P == )
{
q.dis = change(q.dis);
vv[xx][yy][q.dis] = ;
}
que.push(q);
}
else if(mp[xx][yy] == '$')
{
printf("%d\n", p.step+);
return;
}
}
} if((p.step+)%P == ) {p.dis = change(p.dis);} node q;
q.x = p.x;
q.y = p.y;
q.step = p.step+; q.dis = p.dis+;
q.dis %= ;
if(vv[q.x][q.y][q.dis] == )
{
que.push(q);
vv[q.x][q.y][q.dis] = ;
} q.dis = p.dis+;
q.dis %= ;
if(vv[q.x][q.y][q.dis] == )
{
que.push(q);
vv[q.x][q.y][q.dis] = ;
} q.dis = p.dis;
if(vv[q.x][q.y][q.dis] == )
{
que.push(q);
vv[q.x][q.y][q.dis] = ;
}
}
printf("YouBadbad\n");
} int main()
{
//freopen("test.txt", "r", stdin);
scanf("%d", &t);
while(t--)
{
memset(mp, , sizeof(mp));
memset(v, , sizeof(v));
memset(vv, , sizeof(vv));
scanf("%d%d%d", &n, &m, &P);
for(int i = ; i < n; i++)
{
scanf("%s", mp[i]);
}
bfs();
}
}

ZOJ3865:Superbot(BFS) The 15th Zhejiang University Programming Contest的更多相关文章

  1. The 15th Zhejiang University Programming Contest

    a  ZOJ 3860 求和大家不一样的那个数,签到,map水之 #include<cstdio> #include<map> using namespace std; map ...

  2. zoj 4020 The 18th Zhejiang University Programming Contest Sponsored by TuSimple - G Traffic Light(广搜)

    题目链接:The 18th Zhejiang University Programming Contest Sponsored by TuSimple - G Traffic Light 题解: 题意 ...

  3. The 16th Zhejiang University Programming Contest-

    Handshakes Time Limit: 2 Seconds      Memory Limit: 65536 KB Last week, n students participated in t ...

  4. 152 - - G Traffic Light 搜索(The 18th Zhejiang University Programming Contest Sponsored by TuSimple )

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5738 题意 给你一个map 每个格子里有一个红绿灯,用0,1表示 ...

  5. The 19th Zhejiang University Programming Contest - H

    Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Helti ...

  6. The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror) B"Even Number Theory"(找规律???)

    传送门 题意: 给出了三个新定义: E-prime : ∀ num ∈ E,不存在两个偶数a,b,使得 num=a*b;(简言之,num的一对因子不能全为偶数) E-prime factorizati ...

  7. The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror)

    http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=391 A     Thanks, TuSimple! Time ...

  8. 2019 The 19th Zhejiang University Programming Contest

    感想: 今天三个人的状态比昨天计院校赛的状态要好很多,然而三个人都慢热体质导致签到题wa了很多发.最后虽然跟大家题数一样(6题),然而输在罚时. 只能说,水题还是刷得少,看到签到都没灵感实在不应该. ...

  9. Mergeable Stack 直接list内置函数。(152 - The 18th Zhejiang University Programming Contest Sponsored by TuSimple)

    题意:模拟栈,正常pop,push,多一个merge A B 形象地说就是就是将栈B堆到栈A上. 题解:直接用list 的pop_back,push_back,splice 模拟, 坑:用splice ...

随机推荐

  1. HDU4725 The Shortest Path in Nya Graph SPFA最短路

    典型的最短路问题,但是多了一个条件,就是每个点属于一个layer,相邻的layer移动,如x层移到x+1层需要花费c. 一种显而易见的转化是我把这些边都建出来,但是最后可能会使得边变成O(n^2); ...

  2. 使用getJSON()方法异步加载JSON格式数据

    使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...

  3. hibernate.cfg.xml hibernate 配置文件模板

    <?xml version='1.0' encoding='UTF-8'?> <!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition ...

  4. Java中Integer的源码学习

      一.开始 public final class Integer extends Number implements Comparable<Integer> 1).由于类修饰符中有关键字 ...

  5. Linux中断(interrupt)子系统

    Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理 ...

  6. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  7. Java中ArrayList和LinkedList区别

    ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLis ...

  8. CTO俱乐部下午茶:技术团队管理中的那些事儿

    摘要:"CTO下午茶"是一种有效的集体对话的模式,参加活动的成员在真诚互动和共同学习的宗旨下齐聚一堂,在喝茶聊天氛围下交流工作心得.本期"CTO下午茶"的主题是 ...

  9. ie6调试工具Debugbar

    http://www.my-debugbar.com/wiki/Doc/DebugbarInstall

  10. tomcat web.xml配置

    关于Tomcat 中 web.xml 文件的配置问题: 1.下面的配置是合法的     <servlet>        <servlet-name>test</serv ...