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

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

#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. java代码连接oracle数据库的方法

    oracle连接数据库的方式和mysql是大同小异的,主要的困难点在于oracle的数据库驱动包和依赖只有官方提供,如果你是用maven添加依赖的话,需要自己从官网下载jar包安装到你本地的maven ...

  2. TypeError: Data location must be "memory" for return parameter in function, but none was given.

      在用truffle编译智能合约时,报错 TypeError: Data location must be "memory" for return parameter in fu ...

  3. HRNET网络结构简单分析

    hrnet相关的两篇文章 CVPR2019   Deep High-Resolution Representation Learning for Human Pose Estimation High- ...

  4. C#中正则表达式解析字符串信息

    正则表达式提取0~9数字 private static string RegexPickupNumber(string str) { string pattern = @"[^0-9]+&q ...

  5. js es6遍历对象的6种方法(应用中推荐前三种)

        javaScript遍历对象总结 1.for … in 循环遍历对象自身的和继承的可枚举属性(循环遍历对象自身的和继承的可枚举属性(不含Symbol属性).). 2.使用Object.keys ...

  6. ubuntu Tensorflow object detection API 开发环境搭建

    https://blog.csdn.net/dy_guox/article/details/79111949 luo@luo-All-Series:~$ luo@luo-All-Series:~$ s ...

  7. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...

  8. Oracle查询序列和函数方法封装

    工具方法: @Autowired private JdbcTemplate businessTpmeJdbcTemplate; @SuppressWarnings("deprecation& ...

  9. 消息队列之ActiveMQ学习笔记(一、下载及安装)

    1.访问官网地址  http://activemq.apache.org/  ,进入Download 2.选择最新版本 3.或者选择历史版本 4.下载解压后 5.然后再 bin目录下选择对应版本,双击 ...

  10. Entity Framework链接数据库设置

    本人不才,学习EntityFramwork同时做个记录供大家参考.不多说,直接上步骤 1.在WebConfig中添加如下代码段 <connectionStrings> <add na ...