杭电1175——连连看~简单的广搜

这一题,做了好久,终于AC了,感觉题目有点坑,唉,题目不是很难,就是坑!!~~

找一个错误,找了半天,后来才看到是变量用错了!!~

题目中的b数组是标记数组。

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
#define INF 1000000

int xy[4][2] = { { -1 , 0 } , { 1 , 0 } , { 0 , -1 } , { 0 , 1 } };
int m, n;
int x1, x2, y1, y2;
int a[1005][1005], b[1005][1005];
class data
{
public:
	int x, y;
	int k, dir;          //k为转弯数,dir是方向
};

int bfs()
{
	if((x1 == x2 && y1 == y2) || (a[x1][y1] != a[x2][y2]) || !a[x1][y1] || !a[x2][y2])
		return 0;
	queue <data> que;
	data te, temp;
	te.x = x1; te.y = y1;
	te.k = 0; te.dir = -1;
	que.push(te);
	b[te.x][te.y] = 0;
	while(!que.empty())
	{
		temp = que.front();
		que.pop();
		if(temp.x == x2 && temp.y == y2)
			return 1;
		for(int k = 0; k < 4; k++)
		{
			te.x = temp.x + xy[k][0];
			te.y = temp.y + xy[k][1];
			if(temp.dir < 0)
			{
				te.dir = k;
				te.k = 0;
			}
			else if(temp.dir == k)
			{
				te.dir = temp.dir;
				te.k = temp.k;
			}
			else
			{
				te.dir = k;
				te.k = temp.k + 1;
			}
			if(te.x >= 1 && te.x <= m && te.y >= 1 && te.y <= n && te.k <= 2 && te.k <= b[te.x][te.y])  //判断是否符合
			{
				if(a[te.x][te.y] == 0 || (te.x == x2 && te.y == y2))    //判断是否为零或者到终点
				{
					b[te.x][te.y] = te.k;
					que.push(te);
				}
			}
		}
	}
	return 0;
}

int main()
{
	int i, j, num;
	while(scanf("%d%d", &m, &n) != EOF)
	{
		if(m == 0 && n == 0)
			break;
		for(i = 1; i <= m; i++)
		{
			for(j = 1; j <= n; j++)
				scanf("%d", &a[i][j]);
		}
		scanf("%d", &num);
		while(num--)
		{
			scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
			for(i = 0; i <= m; i++)
			{
				for(j = 0; j <= n; j++)
					b[i][j] = INF;
			}
			if(bfs())
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
}
时间: 2024-10-12 20:46:33

杭电1175——连连看~简单的广搜的相关文章

杭电 1372 Knight Moves(广搜模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6439    Accepted Submission(s): 3886 Problem Description A friend of you is doing res

杭电ACM1312——Red and Black~~广搜

这一题,简单的广搜或者深搜都可以搞定,时间复杂度都差不多. 我用的是广搜.题目的意思是:@是一个人的起始位置,#不可以走,. 可以走,求出可以走的位置的个数. 一开始没有用结构体来存储坐标,直接用的是z = x * 10 + y:将z入队,结果错了,原因是在取余整除的时候会出错.改用结构体就OK了. 下面是AC的代码: #include <iostream> #include <queue> #include <cstdio> using namespace std;

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

北大ACM3669——Meteor Shower~~简单的广搜

这一题,简单的广搜的应用,只是题目的陷进比较多. 题目大概的意思是,一个人在Point(0,0)的位置,然后会有陨石坠落,陨石坠落的地方的上下左右中都会被砸毁,每一个陨石会在第T秒坠落.问你找到一个安全的地方的最短时间,否则输出-1. 下面是AC的代码,有详细的注释: #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm

poj 3278:Catch That Cow(简单一维广搜)

Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,00

poj 2251 Dungeon Master(简单三维广搜)

题意: 之前做过的所有题都是   在一个平面   上搜索 . 本题很新,在一个三维空间里 ,首先   l  x  y   分别代表 l 层   每一层有 x 行   y 列 问从 S 开始   走到 E   最小步是多少    显然用广搜,只是多了一个向上向下的搜索. 注意: 所谓广搜  ,是一层一层的搜,  每一层其步数是一样的   ,可以通过建立一个数组存步数 ,也可以 将步数同时存入队列中 另外搜过的要做标记, 在做标记时  尽量要在里面做标记(就是每搜过一个点就  立马 将之标记)不然一

杭电oj~1005 简单的找周期

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 153132    Accepted Submission(s): 37335 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

杭电ACM1240——Asteroids!~~简单的BFS

这道题目,三维空间上的BFS,给你起点和终点,看能否找到一条路,O表示可以走,X表示不可以走!~ 理解了题目,就可以用队列来实现BFS来求解. 下面的是AC 的代码: #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; class data { public: int xyz; int count; }; char map