`

【搜索之BFS + 剪枝】杭电 hdu 1175 连连看

阅读更多

/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
    Copyright (c) 2012 panyanyany All rights reserved.

    URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1175
    Name  : 1175 连连看

    Date  : Thursday, April 05, 2012
    Time Stage : 2 hours

    Result:
5713239	2012-04-05 21:14:58	Accepted	1175
296MS	25372K	3624 B
C++	pyy


Test Data :

Review :
做了那么多次,终于都AC了……
之前一直以为BFS比DFS快,但是看了很多人DFS的效果,居然神奇又吐血地比我快了十倍,达到
了30几MS,而且看别人BFS的效果,也是上千MS,反正综合比起来,BFS居然比DFS还慢。
后来想到,DFS可以快速深入,而BFS则是向四面八方快速扩展。也就是说,同样是直线的距离,
假如以最快的方法,DFS用5s的时间可以到,那么BFS则是这样的,第1s,扩展一步之遥的一个格,
第2s,一步之遥的另一个格,第3s,第4s,同理……于是4s之后,DFS已经走出4步远了,
BFS还在第一步……接下来时间的差距就会越来越大了。当然这种情况对图的要求比较特别,
HDU的图貌似正好就是这样的,反正我优化后的速度都快不了……
//----------------------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>

#include <algorithm>
#include <iostream>
#include <queue>

using namespace std ;

#define MEM(a, v)        memset (a, v, sizeof (a))    // a for address, v for value
#define max(x, y)        ((x) > (y) ? (x) : (y))
#define min(x, y)        ((x) < (y) ? (x) : (y))

#define INF     (0x3f3f3f3f)
#define MAXN    (1002)

#define DB    /##/
#define LL __int64
#define _RANGE(a, b, e)		((b) <= (a) && (a) < e)
#define _IN(nd)				(_RANGE((nd).x, 0, m) && _RANGE((nd).y, 0, n))
#define _MAP(nd)			map[(nd).y][(nd).x]
#define _PATH(nd)			path[(nd).y][(nd).x]
#define _VIS(nd)			vis[(nd).y][(nd).x]

struct NODE {
	int x, y, px, py;
	int step;
	int corn;
};

const int dir[4][2] = {0,1, 0,-1, 1,0, -1,0};

int		n, m;
bool	vis[MAXN][MAXN];
char	map[MAXN][MAXN];
NODE	beg, end, path[MAXN][MAXN];

void bfs()
{
	int i;
	queue<NODE>	q;
	NODE		t, nt;

	MEM(path, -1);
	MEM(vis, 0);

	beg.step = 0;
	beg.corn = 0;
	beg.px = beg.x;
	beg.py = beg.y;

	q.push(beg);
	while (!q.empty())
	{
		t = q.front();
		q.pop();

		for (i = 0; i < 4; ++i)
		{
			nt = t;

			if (t.corn == 2)	// 剪枝……几乎没效果
			{
				i = 4;
				if (nt.y > nt.py)
					++nt.y;
				else if (nt.y < nt.py)
					--nt.y;
				else if (nt.x > nt.px)
					++nt.x;
				else if (nt.x < nt.px)
					--nt.x;
			}
			else
			{
				nt.y += dir[i][0];
				nt.x += dir[i][1];
			}

			if (!_IN(nt) || ('0' != _MAP(nt) && _MAP(end) != _MAP(nt)))
				continue;
			/* 下一条语句是为了处理这种情况
			3 4
			1 1 1 1
			0 0 0 0
			1 1 1 1
			1
			1 1 3 3
			防止它这样走: (1,1)->..(省略号表示直线)..->(1,3)->..->(3,3)
			即是说,即使遇到相同类型的子,只要不是end指定的目标,就只能当成
			障碍跳过.
			*/
			if (_MAP(end) == _MAP(nt) && !(nt.x == end.x && nt.y == end.y))
				continue;

			if (nt.y == t.py && nt.x == t.px)	// 后退了
				continue;

			if (nt.y != t.py && nt.x != t.px)	// 转弯
			{
				nt.py = t.y;
				nt.px = t.x;
				++nt.corn;
			}
			else								// 没有转弯
			{
				nt.py = t.y;
				nt.px = t.x;
			}

			if (nt.corn >= 3 || (_VIS(nt) && nt.corn >= _PATH(nt).corn))
				continue;	// 这里不剪,貌似会超时的

DB			printf ("nt:(%d,%d)<--(%d,%d) corn:%d step:%d\n", nt.y, nt.x,	\
				nt.py, nt.px, nt.corn, nt.step);
			++nt.step;
			_PATH(nt) = nt;
			_VIS(nt) = true;
			if (nt.y == end.y && nt.x == end.x)
				return ;
			q.push(nt);
		}
	}
}

int main()
{
	int i, j, q;
	while (scanf("%d %d", &n, &m), n | m)
	{
		getchar();
		for (j = 0; j < n; ++j)
		{
			for (i = 0; i < m; ++i)
			{
				scanf("%c", &map[j][i]);
				getchar();
			}
		}
		scanf("%d", &q);
		for (i = 0; i < q; ++i)
		{
			scanf("%d %d %d %d", &beg.y, &beg.x, &end.y, &end.x);
			--beg.y; --beg.x;
			--end.y; --end.x;
			if (!_IN(beg) || !_IN(end) || _MAP(beg) != _MAP(end) || '0' == _MAP(beg))
			{
				puts("NO");
				continue;
			}
			if (beg.x == end.x && beg.y == end.y)
			{
				puts("YES");
				continue;
			}
			bfs();
			if (0 <= _PATH(end).corn && _PATH(end).corn <= 2)
				puts("YES");
			else
				printf ("NO\n");
		}
	}
	return 0;
}
 
0
0
分享到:
评论

相关推荐

    BFS++ 管理员手册

    BFS++ 是西门子一个优秀的资产管理软件。主要应用于电厂等大型资产密集型企业。

    bfs++培训资料

    **BFS++培训资料概述** BFS++是一个专为电厂生产管理设计的综合系统,它融合了网络技术和数据库管理,核心目标是对电厂设备的运行与维修进行高效管理。该系统涵盖了六个关键模块,分别是基本系统、设备数据管理、...

    bfs.rar_BFS+c++_bfs

    **广度优先搜索(BFS)是图论中一种经典的遍历算法,它按照“先访问邻居节点,再访问其邻居”的顺序进行搜索。在C++编程语言中实现BFS,我们可以利用队列数据结构来辅助完成。** **标题中的“bfs.rar_BFS+c++_bfs”...

    bfs-dfs.rar_BFS algoritm_BFS+c++

    标题 "bfs-dfs.rar_BFS algoritm_BFS+c++" 指示了这个压缩包包含的是关于广度优先搜索(BFS)算法的实现,且是用C++编程语言编写的。描述 "bfs ,dfs algoritm in TC" 表明该算法在文本编辑器或编译器如Turbo C中进行...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    BFS+hash.rar_bfs_hash ACM_hash acm

    本压缩包文件"**BFS+hash.rar_bfs_hash ACM_hash acm**"关注的是两种常用的算法——宽度优先搜索(Breadth First Search, BFS)和哈希表(Hash Table)的应用。这两种算法在解决特定问题时有着显著的优势,特别是在...

    POJ3026-Borg Maze【BFS+Prim】

    在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨这两种算法在解决实际问题中的应用。 “Borg Maze”...

    bfs.rar_hdu

    题目“bfs.rar_hdu”暗示了这是一个关于广度优先搜索(Breadth-First Search, BFS)的问题,源自HDU(杭州电子科技大学)的在线编程竞赛平台。通常,这类题目会涉及图论或者树的遍历,考察算法实现和逻辑思维能力。 ...

    图的相关算法总结dfs+bfs+prim+kruskal等

    图的相关算法比较全面的总结,包括了图的深度和广度遍历算法,prim和kruskal两种最小生成树的算法,邻接矩阵和邻接表两种储存结构,做课程设计、实验报告或者数据结构学习者可以参考参考啊``源代码都是我亲手打的,...

    ACM搜索算法:DFS+BFS+A*及动态规划

    "算法合集之《浅谈部分搜索+高效算法在搜索问题中的应用_》.pdf"和"搜索算法全集.pdf"提供了搜索算法的全面概述,可能包括多种搜索策略的比较、实例分析和优化方法。 通过学习这些文档,ACM竞赛参与者可以系统地...

    ACM比赛常见算法之BFS算法+back回文字符串

    ACM比赛常见算法之BFS算法+back回文字符串 ACM比赛常见算法之BFS算法+back回文字符串 ACM比赛常见算法之BFS算法+back回文字符串 ACM比赛常见算法之BFS算法+back回文字符串 ACM比赛常见算法之BFS算法+back回文...

    acm课件搜索(杭电)(HDU)

    "acm课件搜索(杭电)(HDU)"这个主题聚集了相关的学习材料,特别是针对搜索算法的讲解,旨在帮助学生快速掌握并应用这些技术。 搜索算法在ACM竞赛中扮演着至关重要的角色,常见的搜索策略包括深度优先搜索(DFS)...

    Floyd算法求任意两点间的最短距离+BFS+DFS

    用邻接矩阵来存储图,Floyed算法求任意两点间的最短路径并输出,广度优先遍历,深度优先遍历

    C++-VS2019-迷宫寻路BFS+DFS代码.zip

    最终效果是实现了Prim随机生成迷宫,BFS&DFS路径显示、最短路长度显示、过程动态展示,主函数中有菜单,操作方便。 不仅可以用来读代码长知识、还可以用作算法演示。 附带第五版的exe文件,欢迎使用!

    算法-连连看(HDU-1175)(包含源程序).rar

    在编程领域,实现连连看算法具有一定的挑战性,涉及到图论、深度优先搜索(DFS)、广度优先搜索(BFS)等计算机科学知识。本压缩包中的资源——"算法-连连看(HDU-1175)(包含源程序).pdf"很可能提供了一个关于...

    有關西門子電廠IT解決方案.ppt

    维护管理是BFS++的重要功能之一,涵盖了设备的维护历史记录、植物数据管理和备件管理。有效的维护策略可以预防故障发生,延长设备寿命,降低停机时间。项目管理则确保了电厂改造和升级工作的顺利进行。 文档管理...

    DFS+BFS深度+广度优先遍历.cpp

    DFS+BFS深度+广度优先遍历.cpp

    杭电ACM 题目分类 不完全 记录搜索,递归求解

    根据给定的信息,本文将对杭电ACM题目中的搜索与递归求解知识点进行详细的解析,特别是针对题目编号为1010、1016、1026、1043(双广)、1044(BFS+DFS)等题目进行深入分析,并涵盖其他相关的知识点。 ### 搜索技术...

    搜索之BFS算法

    详细地介绍BFS的思路模式以及用几个案例教授怎么运用BFS去解题。

    zoj_1004.cpp BFS版本

    zoj_1004.cpp 求单词字母进出栈后能形成目标串的进出方案 广度优先搜索求解

Global site tag (gtag.js) - Google Analytics