HDU 1175 连连看【BFS】
来源:互联网 发布:windows远程登录工具 编辑:程序博客网 时间:2024/05/16 07:31
连连看
Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 21 Accepted Submission(s) : 5
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
Input
输入数据有多组。每组数据的第一行有两个正整数n,m(0<n<=1000,0<m<1000),分别表示棋盘的行数与列数。在接下来的n行中,每行有m个非负整数描述棋盘的方格分布。0表示这个位置没有棋子,正整数表示棋子的类型。接下来的一行是一个正整数q(0<q<50),表示下面有q次询问。在接下来的q行里,每行有四个正整数x1,y1,x2,y2,表示询问第x1行y1列的棋子与第x2行y2列的棋子能不能消去。n=0,m=0时,输入结束。
注意:询问之间无先后关系,都是针对当前状态的!
注意:询问之间无先后关系,都是针对当前状态的!
Output
每一组输入数据对应一行输出。如果能消去则输出"YES",不能则输出"NO"。
Sample Input
3 41 2 3 40 0 0 04 3 2 141 1 3 41 1 2 41 1 3 32 1 2 43 40 1 4 30 2 4 10 0 0 021 1 2 41 3 2 30 0
Sample Output
YESNONONONOYES
去年用DFS做了一遍
今年用BFS再做一遍
#include<stdio.h>#include<queue>#include<string.h>using namespace std;struct node{ int x,y,turn;};int n,m;node s,e;int map[1010][1010];int map2[1010][1010];bool vis[1010][1010];int step[4][2]= {1,0,-1,0,0,1,0,-1};int check(int x,int y){ if(x>=1&&y>=1&&x<=n&&y<=m&&map2[x][y]!=55) return 1; return 0;}void BFS(node a,node b){ memset(vis,false,sizeof(vis)); node n,nn; int nx,ny; n.x=a.x; n.y=a.y; n.turn=-1; queue<node>q; q.push(n); vis[a.x][a.y]=true; while(!q.empty()) { n=q.front(); q.pop(); if(n.turn>2)//时间从6000MS减少到2000MS { printf("NO\n");return ; } for(int i=0; i<4; i++) { nx=n.x+step[i][0]; ny=n.y+step[i][1]; while(check(nx,ny)) { if(vis[nx][ny]==false) { vis[nx][ny]=true; nn.x=nx; nn.y=ny; nn.turn=n.turn+1; // printf("%d %d %d\n",nx,ny,nn.turn); if(map[nn.x][nn.y]==map[b.x][b.y]&&nn.turn<=2) { printf("YES\n"); return ; } q.push(nn); } nx+=step[i][0]; ny+=step[i][1]; } } } printf("NO\n");}int main (void){ while(~scanf("%d%d",&n,&m)&&n) { memset(map,0,sizeof(map)); for(int i=1; i<=n; i++) { for(int ii=1; ii<=m; ii++) { scanf("%d",&map[i][ii]); } } int time; scanf("%d",&time); while(time--) { memset(map2,0,sizeof(map2));//更新地图 scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y); if(map[s.x][s.y]==map[e.x][e.y]&&map[s.x][s.y]!=0) { for(int i=1; i<=n; i++)//把路和起点 终点 标记成0 其余的标记成55 开始用的是‘.’但是这是int数组 就改成55 这个数字不在0<p<50范围 所以可以用 { for(int ii=1; ii<=m; ii++) { if(i==s.x&&ii==s.y) continue; if(i==e.x&&ii==e.y) continue; if(map[i][ii]==0) map2[i][ii]=0; else map2[i][ii]=55; } } /* for(int i=1; i<=n; i++) { for(int ii=1; ii<=m; ii++) { printf("%3d",map2[i][ii]); } printf("\n"); }*/ BFS(s,e); } else printf("NO\n"); } } return 0;}
感谢这个测试数据 终于找到WA的原因 我也推荐给大家
4 40 1 2 20 2 2 20 2 1 20 0 0 211 23 3
8 81 2 7 0 0 3 5 60 0 4 0 5 6 0 00 0 5 0 4 8 7 00 0 0 0 0 0 0 02 0 8 0 0 0 0 76 5 3 0 2 4 0 97 0 0 0 0 0 0 79 7 9 8 6 6 1 51001 1 8 7 1 2 5 1 3 6 5 3 3 6 8 4 5 8 7 8
0 0
- hdu 1175 连连看 bfs
- hdu 1175 连连看 (BFS)
- hdu 1175 连连看 BFS
- Hdu 1175 连连看 [Bfs]
- HDU 1175 连连看(BFS)
- HDU 1175 连连看【BFS】
- HDU 1175 连连看(BFS)
- HDU 1175 连连看 BFS
- HDU 1175 连连看【BFS】
- hdu 1175 连连看 bfs
- HDU 1175 连连看 简单的BFS
- hdu 1175 连连看 (bfs)
- HDU 1175 连连看(bfs)
- HDU 1175 连连看(bfs + 剪枝)
- hdu 1175 连连看(bfs)
- HDU 1175 连连看(BFS)
- hdu 1175 连连看(BFS)
- HDU-1175 连连看(BFS 或 DFS)
- 牛客网 7-27 网络基础 操作系统 编译与体系结构 30题知识点总结
- JVM(二)内存
- js自定义随机数插件:yiRan
- Hibernate不能建表的问题
- JQuery学习之旅(2)
- HDU 1175 连连看【BFS】
- Google推荐的图片加载库Glide介绍
- While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/sass
- 安卓设置Activity进入和退出动画及样式
- qsort()函数
- jsp <%%> <%!%>的区别
- Android 自定义View 图片按Path运动和旋转
- 基本数据类型
- CSS3技巧:利用css3径向渐变做一张优惠券