hdu - Problem 1175 连连看 【bfs】

来源:互联网 发布:网络教育统考成绩 编辑:程序博客网 时间:2024/06/05 06:25

http://acm.hdu.edu.cn/showproblem.php?pid=1175

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 32089    Accepted Submission(s): 7900


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
 

Recommend
We have carefully selected several similar problems for you:  1180 1072 1016 1026 1240 
 

好久没有做图的题了 ,水下,这个就是有个拐点限制。

#include <map>#include <set>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <iostream>#include <stack>#include <cmath>#include <string>#include <vector>#include <cstdlib>//#include <bits/stdc++.h>//#define LOACL#define space " "using namespace std;typedef long long LL;typedef __int64 Int;typedef pair<int, int> paii;const int INF = 0x3f3f3f3f;const double ESP = 1e-5;const double PI = acos(-1.0);const int MOD = 1e9 + 7;const int MAXN = 1000 + 10;int data[MAXN][MAXN], n, m;int dx[] = {0, 1, 0, -1};int dy[] = {1, 0, -1, 0};struct node {int x, y;int dit;int turn;} loc[2], t, temp;bool bfs(node s, node e) {queue <node> que;bool vis[MAXN][MAXN];memset(vis, false, sizeof(vis));for (int i = 0; i < 4; i++) {t = s;t.x = s.x + dx[i];t.y = s.y + dy[i];t.dit = i;t.turn = 2;que.push(t);}while (que.size()) {temp = que.front(); que.pop();//cout << temp.x << space << temp.y << space << temp.turn << endl;//cout << "afh" << endl;vis[temp.x][temp.y] = true;if (temp.x < 1 || temp.y < 1 || temp.x > n || temp.y > m) continue;if (temp.x == e.x && temp.y == e.y) return true;if (data[temp.x][temp.y]) continue;if (temp.turn) {for (int i = 0; i < 4; i++) {if (i == temp.dit) continue;t.x = temp.x + dx[i];t.y = temp.y + dy[i];t.dit = i;t.turn = temp.turn - 1;if (!vis[t.x][t.y]) que.push(t);}}t.x = temp.x + dx[temp.dit];t.y = temp.y + dy[temp.dit];t.dit = temp.dit;t.turn = temp.turn;if (!vis[t.x][t.y]) que.push(t);}return false;}int main() {while (scanf("%d%d", &n, &m) != EOF) {if (n == 0 && m == 0) break;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf("%d", &data[i][j]);}}int op;scanf("%d", &op);while (op--) {scanf("%d%d%d%d", &loc[0].x, &loc[0].y, &loc[1].x, &loc[1].y);if (data[loc[0].x][loc[0].y] != data[loc[1].x][loc[1].y]) printf("NO\n");else if (!data[loc[0].x][loc[0].y] || !data[loc[1].x][loc[1].y]) printf("NO\n");else if (loc[0].x == loc[1].x && loc[0].y == loc[1].y) printf("YES\n");else {if (bfs(loc[0], loc[1])) printf("YES\n");else printf("NO\n");}}}return 0;}/*2 21 00 111 12 2*/


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 口红弄到牛仔裤上怎么办 口红弄到沙发上怎么办 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办 拔完火罐洗澡疼怎么办 拔罐之后脊背疼怎么办? 五个月的狗胆小怎么办 电脑颜色不正常分辨率调不了怎么办 宝宝认人怎么办 五个月 新生儿42天听力筛查未通过怎么办 幼儿大便干燥拉不下粑粑怎么办 宝宝大便干燥拉粑粑带浓血怎么办 新生儿便秘4天了怎么办 写卷子的题目不认识怎么办? 2个月小猫尿床怎么办 安全教案鱼刺卡住了怎么办 被鱼刺卡住怎么办安全教案 小班健康教案生病了怎么办 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办? 孩子挑食不吃菜不吃肉怎么办 微信新的朋友回复频繁怎么办 忘了闺蜜生日怎么办 把闺蜜生日忘了怎么办 忘了闺蜜的生日怎么办 一岁宝宝不吃菜怎么办 幼儿园教案虫子爬进耳朵怎么办 鼻子出血怎么办幼儿说课 英语记不住发音不准怎么办 幼儿园孩子拼音记不住怎么办