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

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

*******所以用     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. VS中空项目、win32项目、控制台程序的区别(转)

    空项目,大多数想单纯创建c++工程的新同学,打开vs后很可能不知道选择创建什么工程,这时候请相信我,空项目是你最好的选择.因为空工程不包含任何的源代码文件,接下来你只需要在相应的源代码文件夹和头文件文 ...

  2. Linux - rm 修复误删文件

    fdisk -l # 分区信息lsblk -f # 查看文件类型/etc/fstab # 查看文件格式挂载启动信息 # debugfs针对 ext2 # ext3grep针对 ext3 # extun ...

  3. SVM实例及Matlab代码

    ******************************************************** ***数据集下载地址 :http://pan.baidu.com/s/1geb8CQf ...

  4. Shell高级编程学习笔记(基础篇)

    目录 1.shell脚本的执行方法  2.shell的变量类型  3.shell特殊变量 4.变量子串的常用操作  5.批量修改文件名实践   6.变量替换 7.在shell中计算字符串长度的方法  ...

  5. Dubbo重试次数

    服务超时后重试次数[retries],不包含第一次调用,0代表不重试 *我们应该在幂等方法上设置重试次数[查询.删除.修改],在非幂等方法上禁止设置重试次数. ★幂等:指多次运行方法所产生的最终效果是 ...

  6. 笔记软件 notion

    笔记软件 notion :     https://www.notion.so 注册:zengxinle@126.com     团队:Hopesun

  7. [学习笔记]JS计数器,闭包和localStorage

    1.前言 Javascript也算用了挺久了,为了得到一个变量,类似Java的静态变量的功能,我想到了很早以前学习JS的闭包,还有做俄罗斯方块的排行榜用到LocalStorage技术,所以想总结一下, ...

  8. JDK1.5引入的concurrent包

    并发是伴随着多核处理器的诞生而产生的,为了充分利用硬件资源,诞生了多线程技术.但是多线程又存在资源竞争的问题,引发了同步和互斥,并带来线程安全的问题.于是,从jdk1.5开始,引入了concurren ...

  9. Android Studio gradle配置详解

    android gradle配置详解 AppExtension类及其属性 可能大部分人看到AppExtension类会感觉到非常的陌生,其实我们在app中的build.gradle中填写配置信息的时候 ...

  10. 【ES】学习1-入门使用

    参考资料: https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_search_lite.htm 1.查询es数据的方法 ...