HDU 1175 连连看 (BFS 或者 DFS)
来源:互联网 发布:手机养狗软件 编辑:程序博客网 时间:2024/06/06 02:49
连连看
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28889 Accepted Submission(s): 7209
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
Author
lwg
题解:玩过连连看的人都知道吧。。。只是他会问你,这两个点可不可以连接,连线只能穿过是0的地方,连线不能从外围绕过。
BFS撸一波
AC代码:
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<cstdlib> #include<iomanip> #include<vector> #include<list> #include<queue> #include<algorithm> using namespace std;int n,m;int map[1001][1001];int mark[1001][1001];int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};struct node{int i, j;int dir;int mark;};int bfs(int a,int b,int c,int d){int i,j;queue<node>q;node s;s.i=a;s.j=b;s.dir=0;s.mark=-1;mark[a][b]=-1;q.push(s);while(!q.empty()){node k=q.front();q.pop();int x,y;x=k.i; y=k.j;if(k.mark>mark[x][y]){continue;}for(i=0;i<4;i++){int dx,dy;dx=x+dir[i][0];dy=y+dir[i][1];if(dx>=0 && dy>=0 &&dx<n && dy<m ){if(dx==c && dy==d||map[dx][dy]==0){ node dk; dk.i=dx; dk.j=dy; dk.dir=i+1; if(dk.dir!=k.dir) { dk.mark=k.mark+1; } else { dk.mark=k.mark; } if(dk.mark>2) { continue; } if( mark[dx][dy]==-1||dk.mark<mark[dx][dy]) { mark[dx][dy]=dk.mark; q.push(dk); if(dx==c&&dy==d) { return 1;}} }}}}return 0;}int main(){ while(cin>>n>>m&&n&&m) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>map[i][j]; }}int k;cin>>k;for(int i=0;i<k;i++){int a,b,c,d;cin>>a>>b>>c>>d;if(map[a-1][b-1]==0||map[c-1][d-1]==0){printf("NO\n");}else if (map[a-1][b-1]!=map[c-1][d-1]){printf("NO\n");}else if(a==c&&b==d){printf("NO\n");}else {memset(mark,-1,sizeof(mark));if(bfs(a-1,b-1,c-1,d-1)){printf("YES\n");}else{printf("NO\n");}}}}return 0;}
DFS撸一波
AC代码:
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<cstdlib> #include<iomanip> #include<vector> #include<list> #include<queue> #include<algorithm> using namespace std;int n,m,map[1005][1005];int x1,x2,yy1,y2,flag; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};void dfs(int now,int step,int x,int y){ if(flag==1) return ; if(step>2||step==2&&(x-x2)&&(y-y2)) //关键 return ; if(x==x2&&y==y2) { flag=1; return; } for(int i=0;i<4;i++) { int dx=x+dir[i][0];int dy=y+dir[i][1];int step1=step+1; if(now==i+1||now==0) step1--; if(dx>=1&&dx<=n&&dy>=1&&dy<=m) { if(map[dx][dy]==0) { map[dx][dy]=1; dfs(i+1,step1,dx,dy); map[dx][dy]=0; } else if(dx==x2&&dy==y2) { dfs(i+1,step1,dx,dy); if(flag==1) return ; } } }}int main(){ int i,j,k; while(~scanf("%d%d",&n,&m)&&(m||n)) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]); int q; scanf("%d",&q); while(q--) { scanf("%d%d%d%d",&x1,&yy1,&x2,&y2); if(map[x1][yy1]!=map[x2][y2]||map[x1][yy1]==0) goto a; flag=0; dfs(0,0,x1,yy1); if(flag) puts("YES"); else { a: puts("NO"); } } } return 0; }
1 0
- HDU 1175 连连看 (BFS 或者 DFS)
- HDU-1175 连连看(BFS 或 DFS)
- HDU 1175 连连看(dfs,bfs)
- HDU 1175—— 连连看( BFS 、DFS)
- HDU 1175 连连看(BFS或DFS)
- HDU 1175 连连看(bfs+dfs 水过)
- hdu 1175 连连看 (bfs)
- HDU 1175 连连看(bfs)
- hdu 1175 连连看(bfs)
- HDU 1175 连连看(BFS)
- hdu 1175 连连看(BFS)
- HDU 1175 连连看 (BFS)
- HDU 1175 连连看(BFS)
- hdu 1175 连连看 (DFS)
- hdu 1175 连连看 (DFS)
- hdu 1175 连连看(DFS)
- hdu 1175 连连看 (简单DFS)
- HDU 1175 连连看(DFS)
- 软件工程(二十五)
- Hard-题目12:115. Distinct Subsequences
- 输入2个整数,计算两数相除的商(q)和余数(r)。
- 学习的进度慢,没技巧!
- Hard-题目13:72. Edit Distance
- HDU 1175 连连看 (BFS 或者 DFS)
- SpringMVC之类型转换Converter
- Hard-题目14:25. Reverse Nodes in k-Group
- 图的遍历算法实现DFS,BFS
- iOS学习- 08 Auto Layout 支持不同屏幕的Iphone设备
- linux下安装pip
- Hard-题目15:239. Sliding Window Maximum
- URL重写
- 11、“小练习”学习