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

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

#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. python中heapq对dict进行排序

    问题: 想从以下形式的dict中取value最大的2个key-value的key dict_num_num = {0: 0.07374631268436578, 1: 0.16307692307692 ...

  2. 解决python 保存json到文件时 中文显示16进制编码的问题

    python 2.7 import codecs import json with codecs.open('Options.json', 'w', encoding='utf-8') as f: j ...

  3. 用jeecg做个项目第三讲(自定义导入导出)

    1.导入 前端js和跳转页面 <t:dgToolBar title="导入单一模板" icon="icon-put" funname="Impo ...

  4. Java动态修改运行环境

    1.pom.xml直接添加一下配置 <profiles> <profile> <id>dev</id> <properties> <a ...

  5. Onvif协议及其在Android下的实现

    好久没有写博客,今天将前段时间做的Onvif协议在Android上的实现分享给大家. 首先,我们先来了解一下什么是Onvif协议:ONVIF 协议是由Open Network Video Interf ...

  6. C++ nth_element greater

    #include <iostream>#include <algorithm>#include <deque>#include <vector>#inc ...

  7. 09 Flutter底部Tab切换保持页面状态的几种方法

    IndexedStack:保此所有页面的状态: AutomaticKeepAliveClientMixin:保此部分页面的状态: 修改的页面代码: 页面效果: Tabs.dart import 'pa ...

  8. JavaScript 异步和单线程

    JavaScript语言本身是单线程的,所以它自身不可能是异步.所谓单线程,就必然意味着:所有任务需要排队,前一个任务结束,才会执行后一个任务. 但js的宿主环境(比如浏览器,Node)是多线程的.宿 ...

  9. Generate Maximum revenue by selling K tickets from N windows

    Objective: Given ‘N’ windows where each window contains certain number of tickets at each window. Pr ...

  10. CentOS7.5使用RPM包安装MySQL5.7.22

    参考:https://blog.csdn.net/sevenkoala/article/details/76163853 1,安装环境查看 2,下载安装rpm包 下载地址:https://downlo ...