/* 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;
}
分享到:
相关推荐
在编程领域,实现连连看算法具有一定的挑战性,涉及到图论、深度优先搜索(DFS)、广度优先搜索(BFS)等计算机科学知识。本压缩包中的资源——"算法-连连看(HDU-1175)(包含源程序).pdf"很可能提供了一个关于...
少儿编程scratch项目源代码文件案例素材-直升机飞行.zip
wanjunshe_Python-Tensorflow_12888_1745868924470
健康监测_Android开发_BLE蓝牙通信_心率数据采集与存储_基于小米手环2的实时心率监测应用_支持后台长时间运行的心率记录工具_可导出SQLite数据库的心率数据分析系统_适
少儿编程scratch项目源代码文件案例素材-种花模拟器.zip
嵌入式系统开发_FreeRTOS实时操作系统_STM32F103C8T6微控制器_OLED显示屏_DHT11温湿度传感器_多任务调度_多级菜单设计_万年历算法_电子闹钟功能_参数配
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
scratch少儿编程逻辑思维游戏源码-猫猫粉碎.zip
scratch少儿编程逻辑思维游戏源码-蓝胡子.zip
scratch少儿编程逻辑思维游戏源码-美食大亨.zip
scratch少儿编程逻辑思维游戏源码-洛克人.zip
scratch少儿编程逻辑思维游戏源码-龙冲刺.zip
思幻个人引导页V2.2版本11月29日更新.zip
scratch少儿编程逻辑思维游戏源码-骑士风斩法.zip
移动应用开发_H5CSS3ionicng-cordovaMVVM模式_基于HTML5和CSS3技术实现多页面布局ionic指令数据绑定ui-route单页跳转调用手机
少儿编程scratch项目源代码文件案例素材-植物大战僵尸创造版 Ver. 1.0.3.zip
scratch少儿编程逻辑思维游戏源码-日落(2).zip
动态星空背景个人主页(带后台).zip
scratch少儿编程逻辑思维游戏源码-迷雾森林:诞生 3.2 起源觉醒.zip
lib文件