难点在于判断转弯小于两次  这个还好

主要是   走过的路还能再走 但是去掉标记数组会超时

*******所以用     v.step<=f[v.x][v.y]即可!!!  这个思想非常重用!!

查了我一个小时的错误终于找出来了!!!!!!!  !!!!!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std; int world[][];
int f[][];
int dx[]={,,-,};
int dy[]={,,,-};
int n,m;int sx,sy,ex,ey; struct node
{
int x,y,d1,chance;
node(int x=,int y=,int d1=,int chance=):x(x),y(y),d1(d1),chance(chance){} }; void bfs()
{
memset(f,,sizeof(f)); node u(sx,sy,-,);
queue<node>q;
q.push(u);
while(!q.empty())
{
node u=q.front();q.pop();
if(u.x==ex&&u.y==ey&&u.chance<=){printf("YES\n");return ;} for(int i=;i<;i++)
{ node v(u.x+dx[i],u.y+dy[i],u.d1,u.chance); if(v.x>=&&v.x<=n&&v.y>=&&v.y<=m&&((v.x==ex&&v.y==ey)||world[v.x][v.y]==))//这里(v.x==ex&&v.y==ey)不能改成与目标内容相同!!!
{
if(v.d1!=-)
{
if(v.d1!=i)
{
v.chance++;v.d1=i;
} }
else v.d1=i;
if(v.chance>)continue;
if(v.chance<=f[v.x][v.y])
{ // printf("%d %d %d\n",v.x,v.y,v.chance);
f[v.x][v.y]=v.chance;
q.push(v);
}
} } }
printf("NO\n"); } int main()
{ while(cin>>n>>m,(n+m))
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&world[i][j]); int Q;scanf("%d",&Q);
for(int i=;i<=Q;i++)
{
scanf("%d%d%d%d",&sx,&sy,&ex,&ey); if(world[sx][sy]!=world[ex][ey]||!world[sx][sy]||!world[ex][ey]||(ex==sx&&sy==ey))
printf("NO\n");
else
bfs();
} } return ;
}

判断条件需谨慎QAQ

时隔一个月重做一遍

当初的代码真是歪歪扭扭  现在看来好尴尬。。。

其实这题不用采用这种转向次数vis就可以过的  后面貌似有一题必须要改变

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 1000+5
int dx[]={,,,-};
int dy[]={,-,,};
int sx,sy,ex,ey;
int n,m;
int mp[N][N];
int vis[N][N]; bool inmap(int x,int y)
{
return x>=&&x<=n&&y>=&&y<=m;
} struct node
{
int x,y;
int chance;int dic;
node(int x,int y,int chance,int dic):x(x),y(y),chance(chance),dic(dic){}
}; void bfs()
{
queue<node>q;
node u(sx,sy,,-);
q.push(u);
memset(vis,,sizeof vis);
while(!q.empty())
{
node u=q.front();q.pop();
if(u.x==ex&&u.y==ey){printf("YES\n");return ;} for(int i=;i<;i++)
{
node v=u;
v.x+=dx[i];
v.y+=dy[i];
if(inmap(v.x,v.y)&&!vis[v.x][v.y]&&(mp[v.x][v.y]==||(v.x==ex&&v.y==ey) ) )//这里要是改成mp[v.x][v.y]==mp[ex][ey]会错
{
if(v.dic==-)v.dic=i;
else if(v.dic!=i)
{
v.dic=i;v.chance--;
}
if(v.chance<)continue;
q.push(v);
vis[v.x][v.y]=;
}
}
}
printf("NO\n");
} int main()
{
while(scanf("%d%d",&n,&m),(n+m))
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&mp[i][j]);
int q;cin>>q;
while(q--)
{
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(mp[sx][sy]!=mp[ex][ey] ||mp[sx][sy]== )
printf("NO\n");
else
bfs();
}
}
}

连连看 (BFS)的更多相关文章

  1. hdu1175 连连看(bfs疯狂MLE和T,遂考虑dfs+剪枝)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1175/ 题目大意就是给出地图,上面有若干的数,相当于连连看,给了q个查询,问给出的两个位置的数能否在两次转弯以内 ...

  2. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  3. HDU 1175 连连看(BFS)

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. hdu 1175(BFS&DFS) 连连看

    题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...

  5. HDU1175 连连看(bfs) 2016-07-24 13:27 115人阅读 评论(0) 收藏

    连连看 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通 ...

  6. HDU 1175 连连看(超级经典的bfs之一)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  7. 连连看(简单搜索)bfs

    连连看Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

  9. hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...

随机推荐

  1. linq to xml 简单的增、删、改、查、保存xml文件操作

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  2. PyCharm的调试

    1.设置断点 2.debug模式运行    F8      下一行代码 查看当前位置所有局部变量:print(locals()) 查看全局变量:                      print( ...

  3. pygame中多个class类之间的关系

    用一个实例介绍一下有关pygame中不同类之间的通信,详细介绍在代码段有标注,感兴趣的可以复制代码试试: import pygame import sys # -------------------- ...

  4. websocket 工作原理

    自己写一个websocket(教学用) import socket, base64, hashlib sock = socket.socket(socket.AF_INET, socket.SOCK_ ...

  5. mysql 架构 ~异地容灾

    一 简介 我们来探讨下多机房下的mysql架构二 目的:    首先要清楚你的目的     1 实现异地机房的容灾备份      2 实现异地机房的双活 三 叙说     1 实现异地机房的容灾备份  ...

  6. AutoML技术现状与未来展望

    以下内容是对AutoML技术现状与未来展望讲座的总结. 1.机器学习定义 <西瓜书>中的直观定义是:利用经验来改善系统的性能.(这里的经验一般是指数据) Mitchell在<Mach ...

  7. ROS中的CMakeLists.txt

    在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功.如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事.所以深入了解它是很有必要的.现在我们就来看看它 ...

  8. Dubbo——基于Zookeeper服务框架搭建及案例演示

    一.了解SOA微服务架构 在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡. (1) 当服务越来 ...

  9. SCons: 替代 make 和 makefile 及 javac 的极好用的c、c++、java 构建工具

    http://scons.org/ https://www.ibm.com/developerworks/cn/linux/l-cn-scons/index.html 后附:另外,WAF是一个基于sc ...

  10. linux 下程序员专用搜索源码用来替代grep的软件ack(后来发现一个更快的: ag), 且有vim插件的

    发现一个比ack更快更好用的:  https://github.com/ggreer/the_silver_searcher   , 使用时命令为ag,它是基于ack的代码二次开发的,所有使用方法基本 ...