连连看 (BFS)
难点在于判断转弯小于两次 这个还好
主要是 走过的路还能再走 但是去掉标记数组会超时
*******所以用 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)的更多相关文章
- hdu1175 连连看(bfs疯狂MLE和T,遂考虑dfs+剪枝)
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1175/ 题目大意就是给出地图,上面有若干的数,相当于连连看,给了q个查询,问给出的两个位置的数能否在两次转弯以内 ...
- HDU(1175),连连看,BFS
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...
- HDU 1175 连连看(BFS)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 1175(BFS&DFS) 连连看
题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...
- HDU1175 连连看(bfs) 2016-07-24 13:27 115人阅读 评论(0) 收藏
连连看 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通 ...
- HDU 1175 连连看(超级经典的bfs之一)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others) ...
- 连连看(简单搜索)bfs
连连看Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
随机推荐
- Pytorch中的squeeze()和unsqueeze()函数
在numpy库中,经常会出现“秩为1的一维数组”(come from 吴恩达的深度学习,目前还没有搞清楚numpy中如此设计的意图).比如: 注意这里的a的shape是[3] ,既不是 [1,3] 也 ...
- cdn.dns,cms
CDN CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各 ...
- jquery中选择checkbox拼接成字符串,然后到后台拆分取值
jquery中选择checkbox拼接成字符串,然后到后台拆分取值 js中的代码 $("#btn").click(function(){ var chenked=$("i ...
- MoveIt! 源安装
rosdep update sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install python-wstool pytho ...
- python模块分析之typing(三)
前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...
- Python之matplotlib库学习
matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...
- C语言表驱动法编程实践
数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. ——Rob Pike 说明 本文基于这样的认识:数据是易变的,逻辑是稳定的. ...
- 手把手教你写makefile【原创】
Makefile 编写 Make -f makefile1 指定 如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址: http://www.cnblogs ...
- grep基础用法
功能:全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具. grep yuan filename :在文件中搜索yuan 这个字符串,并把含有此字符串的行打印出来,也可以多文件搜索. g ...
- igmp组播测试环境搭建
2.4G无线组播测试环境搭建: (1)组播源: VLC 或者 pixstream (2)无线: 2.4G AP (3)客户端PC: VLC播放器 有线直连 无线2.4G PC(组播源pixstream ...