这道题目由于每走一步的时候毛毛球是可以变换的 换言之 主体不唯一 所以这里搜索的设计有变化

再就是几个回溯的过程要注意。,。  小心使得万年船

#include <iostream>
#include <cstdio>
using namespace std;
char
map[][];
int
num;
int
flag;
int
mmove;
int
dir[][] = {{-,},{,-},{,},{,}}; //U、L、R、D
char tow[] = {'U','L','R','D'}; struct node
{

int
x,y;
int
direction;
}
path[]; int is_in(int x, int y) //判断是否在游戏界面中
{
if
(x >= && x <= && y >= && y <=)
return
;
else
return
;
}
void dfs(int cur)
{

if
(cur == num)
{

//走了num-1步之后直接返回
/*
没成功走一次,都会把一个毛毛球推出游戏界面,所以最多只可能走num-1步
*/
flag =; //已经走完了相应的步数
return;
}
for(int i=; i<=; i++)
{

for
(int j=; j<=; j++)
{

if
(map[i][j] == 'O') //按顺序进行搜索,如果搜索到了一个毛毛球,就看它是否能够移动
{
mmove =;
for
(int d=; d<; d++)
{

int
nx = i + dir[d][];
int
ny = j + dir[d][];
if
(is_in(nx, ny) && map[nx][ny] == 'O') //前方有毛毛球阻碍无法移动,直接continue选取下一个方向
continue; /*
while循环这部分处理是关键,这里主要要处理好手拨动的毛毛球遇到另外一个球时要处理的状况,以及
撞击力量的传递处理。
*/
while
(is_in(nx, ny))
{

nx += dir[d][];
ny += dir[d][]; /* 遇到毛毛球k,其前面那个必然要为'O',而这个毛毛球k必须变为'X'。
通过while循环就可以处理好遇到毛毛球的情况,并且处理好撞击传递
的情况,例如第二组数据的撞击传递,所以这里设计的还是很巧妙的。
*/ if(map[nx][ny] == 'O')
{

mmove =; //手拨动的毛毛球map[i][j]是可以移动的
map[nx][ny] = 'X';
map[nx - dir[d][]][ny - dir[d][]] = 'O';
}
}
if(mmove) //可以移动,进行记录
{
map[i][j] = 'X'; //移动之后原来的位置当然要置为'X'
path[cur].x = i;
path[cur].y = j;
path[cur].direction = d; dfs(cur +);
//回溯之后
if(flag ==) //已经走完了就应该直接返回
return; //反方向走
nx -= dir[d][];
ny -= dir[d][];
while
(nx != i || ny != j) //一直会推到手拨动球的起点map[i][j]
{
if
(map[nx][ny] == 'O') /*这说明是前面的球移动到此处的一个位置,
所以该位置还原成'X',而它后面的那个位置应该
还原成'O'
*/
{

map[nx][ny] = 'X';
map[nx + dir[d][]][ny + dir[d][]] = 'O';
}

nx -= dir[d][];
ny -= dir[d][]; }
map[i][j] = 'O'; //起点还原

} } }
}
}
}
int main()
{

int
kase =;
while
(scanf("%s",map[]) != EOF)
{

num = flag =;
for
(int i=; i<=; i++)
{

scanf("%s",map[i]);
}
for(int i=; i<=; i++)
{

for
(int j=; j<=; j++)
{

if
(map[i][j] == 'O')
{

num++; //记录毛毛球的个数
}
}
}
dfs();
if
(kase !=)
cout<<endl;
cout<<"CASE #"<<kase++<<":"<<endl;
for
(int i =; i<=num-; i++)
{

cout<<path[i].x<<" "<<path[i].y<<" "<<tow[path[i].direction]<<endl;
}
}

return
;
}

hdu 3500 还是搜索的更多相关文章

  1. hdu 5468(莫比乌斯+搜索)

    hdu 5468 Puzzled Elena   /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5   Sample Output Case #1: ...

  2. HDU 4499.Cannon 搜索

    Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  3. HDU 1045 (DFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...

  4. HDU 1180 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...

  5. HDU 2531 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2531 题目大意: 你的身体占据多个点.每次移动全部的点,不能撞到障碍点,问撞到目标点块(多个点)的最 ...

  6. HDU 1026 (BFS搜索+优先队列+记录方案)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:最短时间内出迷宫.迷宫里要杀怪,每个怪有一定HP,也就是说要耗一定时.输出方案. 解 ...

  7. HDU 1312 (BFS搜索模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:问迷宫中有多少个点被访问. 解题思路: DFS肯定能水过去的.这里就拍了一下BFS. ...

  8. HDU 1242 (BFS搜索+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目大意:多个起点到一个终点,普通点耗时1,特殊点耗时2,求到达终点的最少耗时. 解题思路: ...

  9. HDU 1241 (DFS搜索+染色)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目大意:求一张地图里的连通块.注意可以斜着连通. 解题思路: 八个方向dfs一遍,一边df ...

随机推荐

  1. Maven的New中没有Servlet问题(IDEA)

    1.问题 第一次使用Maven骨架创建Web项目的时候,遇到了 New 里面没有 servlet 的问题. 2.原因 经过查询,是因为IDEA检测到项目中没有导入相关的 jar 包导致. 3.解决方法 ...

  2. MongoDB(mongodb-win32-x86_64-enterprise-windows-64-4.2.1-signed.msi)下载,启动和插入数据,查询

    下载链接:https://pan.baidu.com/s/19lM5Q-_BaDbjaO1Pj0SbYg&shfl=sharepset 安装一路Next就行,安装完毕后,进入目录C:\Prog ...

  3. leetcode 96. Unique Binary Search Trees 、95. Unique Binary Search Trees II 、241. Different Ways to Add Parentheses

    96. Unique Binary Search Trees https://www.cnblogs.com/grandyang/p/4299608.html 3由dp[1]*dp[1].dp[0]* ...

  4. LevelListDrawable

    用来管理一组Drawable的,我们可以为里面的drawable设置不同的level, 当他们绘制的时候,会根据level属性值获取对应的drawable绘制到画布上,根节点 为:<level- ...

  5. Connection

    作用: * 获取执行sql语句对象 ** createStatement(): 获取Statement对象 ** prepareStatement(String sql): 获取预处理对象 ** pr ...

  6. Unix/Linux下如何查看DNS服务器地址

    使用命令: cat /etc/resolv.conf 或者 less /etc/resolv.conf 即可. 详细请见:http://www.cyberciti.biz/faq/how-to-fin ...

  7. firewalld介绍

    (1).什么是firewalld? firewalld是提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具. (2).firewalld与iptables之间的关系 ...

  8. 三种单点登录SSO的实现原理

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...

  9. SpringBoot: 15.异常处理方式5(通过实现HandlerExceptionResolver类)(转)

    修改异常处理方式4中的全局异常处理controller package com.bjsxt.exception; import org.springframework.context.annotati ...

  10. 使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)

    了解STM32F103ZET是高容量多管脚的芯片 了解SD读写线路图 了解SD的基地址 阅读STM32F10xx英文参考 SDIO那章,我们编写代码边看文档解析 建工程,打开包含所有包括外设库函数的样 ...