题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/

关于广度优先搜索的第一篇题解。广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止。在扩展的过程中设定一种由上一层扩展到下一层的转化机制,将出现的新的状态放入队列之中,每次取出队首元素,大部分情况下bfs是用来搜索最优值的问题,优先队列的作用就是一旦搜索到目标状态,跟随的结果状态一定是最优的。为了避免重复相同的搜索,可设置访问记录。一般运用队列这种数据结构,使得最初搜索的状态在前,可以继续下一次搜索。

题目意思:给出地图,要求判断在最多k次转弯的条件下是否能够从一点都到另一点。写完记得检查变量的初始化。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
#define maxn 105
#define maxm 2000010
int n,m,t,k;
int Map[maxn][maxn];
int sx,sy,tx,ty;
bool flag=false,vis[maxn][maxn];
int dir[][]={,,,-,,,-,};
struct node{
int x,y;
int step;
node(int x,int y,int step):x(x),y(y),step(step){};
node(){};
};
node cur,nxt;
void bfs()
{
queue<node>q;
node st(sx,sy,-);
q.push(st);
vis[sx][sy]=true;//标记该状态已经访问过
while(!q.empty())
{
cur=q.front();//获取队首结点
q.pop();//队首状态弹出
if(cur.x==tx&&cur.y==ty&&cur.step<=k)
{
// dbg(cur.step);
flag=true;
return;
}
f(i,,)
{
nxt=cur;
nxt.x+=dir[i][];
nxt.y+=dir[i][];
while(nxt.x>=&&nxt.x<n&&nxt.y>=&&nxt.y<m&&Map[nxt.x][nxt.y])//检查是否越界、可走
{
if(!vis[nxt.x][nxt.y])//只要没有访问过,那一定是经过转弯了的,我们设定一次朝着一个方向一直走到底
{
vis[nxt.x][nxt.y]=true;
nxt.step=cur.step+;
q.push(nxt);//合法状态入队
}
nxt.x+=dir[i][];
nxt.y+=dir[i][];//继续朝同一个方向走到底,这个方向上的step都是同一个值
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
scan(t);
while(t--)
{
flag=false;
scan(n);
scan(m);
mem(Map,);
mem(vis,false);
char c;
f(i,,n-)
f(j,,m-)
{
scanf(" %c",&c);
if(c=='.')Map[i][j]=;
}
scanf("%d%d%d%d%d",&k,&sy,&sx,&ty,&tx);//注意数据的读入,行列不可错
sx--,sy--,tx--,ty--;
bfs();
if(flag)pf("yes\n");
else pf("no\n");
}
}

最新文章

  1. 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)
  2. java中Collection和Collections的区别
  3. [MFC] MFC 用mciSendString加载WAV资源文件
  4. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(7)
  5. hdu4604 deque
  6. android Camera拍照 及 MediaRecorder录像 预览图像差90度
  7. QT设置标签字体大小和颜色
  8. linux 常用find命令
  9. YII CDbCriteria总结
  10. Android 手势锁的实现 为了让自己的应用程序的安全,现在
  11. CSS知识点:清除浮动
  12. android下m、mm、mmm编译命令的使用
  13. Kubernetes环境下的各种调试方法
  14. Gitlab-CI持续集成之Runner配置和CI脚本
  15. Http get方式url参数长度以及大小
  16. MySQL之日期时间类型
  17. python 列表 元祖 集合
  18. java学习笔记39(sql事物)
  19. python学习站点
  20. sqlmap的篡改绕过WAF

热门文章

  1. Python【map、reduce、filter】内置函数使用说明
  2. Kafka常用命令及配置文件
  3. Java中间件之RMI及实例介绍 &middot; zijian's blog
  4. mongodb游标快照
  5. 如何理解TCP的三次握手协议?
  6. TCP传输连接管理
  7. 【ThinkPHP6:从TP3升级到放弃】1. 前言及准备工作
  8. Java 设置Excel数据验证
  9. python3.5以及scrapy,selenium,等 安装
  10. tomcat服务器的应用总结