Problem Description
PusherBoy is an online game http://www.hacker.org/push . There is an R * C grid, and there are piles of blocks on some positions. The goal is to clear the blocks by pushing into them.

You should choose an empty area as the initial position of the PusherBoy. Then you can choose which direction (U for up, D for down, L for left and R for right) to push. Once the direction is chosen, the PusherBoy will walk ahead until he met a pile of blocks (Walking outside the grid is invalid). Then he remove one block from the pile (so if the pile contains only one block, it will become empty), and push the remaining pile of blocks to the next area. (If there have been some blocks in the next area, the two piles will form a new big pile.)

Please note if the pusher is right up against the block, he can't remove and push it. That is, there must be a gap between the pusher and the pile. As the following figure, the pusher can go up, but cannot go down. (The cycle indicates the pusher, and the squares indicate the blocks. The nested squares indicate a pile of two blocks.)

And if a whole pile is pushed outside the grid, it will be considered as cleared.

Input
There are several test cases in each input. The first two lines of each case contain two numbers C and R. (R,C <= 25) Then R lines follow, indicating the grid. '.' stands for an empty area, and a lowercase letter stands for a pile of blocks. ('a' for one block, 'b' for two blocks, 'c' for three, and so on.)

Output
Output three lines for each case. The first two lines contains two numbers x and y, indicating the initial position of the PusherBoy. (0 <= x < R, 0 <= y < C). The third line contains a moving sequence contains 'U', 'D', 'L' and 'R'. Any correct answer will be accepted.

Sample Input
3
7
...
...
.b.
...
...
.a.
...

Sample Output
4
1
UDU
题目大意:在R*C的网格里,有的地方有石块,用a~z表示1~26个石块,每次只能隔一个网格清除一个石块,然后把剩下的往前移,注意每次只能选一个方向,直到碰到石块位置,如果朝这个方向一直走没遇到石块而出界了,那么这个方向就是不对的,再选另一个方向,直到所有的石块全被处理掉,只要找到一种方法就直接输出,这题细节挺多的

解题思路:这是典型的dfs,不过我自己还不会写,我看了别人的然后自己写的,有什么不当的望各位大牛指出;

AC代码:

#include<stdio.h>
char p[4]={'R','L','U','D'};
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
char path[1024];//这个是用来记录每次行走的方向
int map[30][30];//在每个点石块的数量
char a[30][30];
int r,c,sum;
int check(int x,int y)//判断是否越界
{
if(x>=0&&x<r&&y>=0&&y<c) return 1;
else return 0;
}
int dfs(int x,int y,int s)
{
int i,tx,ty,k;
if(s==sum)//全部清理完了
{
path[s]='\0';
return 1;
}
for(i=0;i<4;i++)
{
tx=x+dir[i][0];
ty=y+dir[i][1];
if(!check(tx,ty)||map[tx][ty]) continue;//越界了或者该点是石块
while(check(tx,ty)&&!map[tx][ty])//一直往前走遇到石块或者越界
{
tx+=dir[i][0];
ty+=dir[i][1];
}
if(check(tx,ty)==0) continue;//越界了方向不对
k=map[tx][ty];
if(k>1&&check(tx+dir[i][0],ty+dir[i][1])==0) continue;//不止一个石块而且往前一步就越界了
if(k>1) map[tx+dir[i][0]][ty+dir[i][1]]+=k-1;
map[tx][ty]=0;
path[s]=p[i];//记录方向
if(dfs(tx,ty,s+1)) return 1;
map[tx][ty]=k;//还原
map[tx+dir[i][0]][ty+dir[i][1]]-=(k-1);
}
return 0;
}
int main()
{
int i,j;
while(scanf("%d%d",&c,&r)!=EOF)
{
sum=0;
for(i=0;i<r;i++)
{
getchar();
scanf("%s",a[i]);
for(j=0;j<c;j++)
{
if(a[i][j]=='.') map[i][j]=0;
else map[i][j]=a[i][j]-'a'+1;
sum+=map[i][j];//表示十块的总数量
}
}
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
if(map[i][j]==0)
if(dfs(i,j,0))
{
printf("%d\n%d\n%s\n",i,j,path);
i=r;
j=c;
}
}
}
return 0;
}

hdu 2821 Pusher(dfs)的更多相关文章

  1. hdu 2821 Pusher (dfs)

    把这个写出来是不是就意味着把   http://www.hacker.org/push  这个游戏打爆了? ~啊哈哈哈 其实只要找到一个就可以退出了  所以效率也不算很低的  可以直接DFS呀呀呀呀 ...

  2. HDU 5965 扫雷(dfs)题解

    题意:给你一个3*n的格子,中间那行表明的是周围8格(当然左右都没有)的炸弹数量,上下两行都可以放炸弹,问你有几种可能,对mod取模 思路:显然(不),当i - 1和i - 2确定时,那么i的个数一定 ...

  3. HDU 1518 Square(DFS)

    Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...

  4. HDU 1015 Safecracker (DFS)

    题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...

  5. Hdu 1175 连连看(DFS)

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...

  6. HDU 1501 Zipper(DFS)

    Problem Description Given three strings, you are to determine whether the third string can be formed ...

  7. HDU 5305 Friends(dfs)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  8. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  9. HDU 5934 Bomb(炸弹)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

随机推荐

  1. aspose.cells根据模板导出excel

    又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效 ...

  2. android 布局如何支持多种不同屏幕尺寸

    android 布局如何支持多种不同屏幕尺寸 --关于dp.layout-xxx.drawable-xxx作用的小结 转载自:http://blog.csdn.net/vincent_blog/art ...

  3. 使用ImageMagick和Tesseract进行简单数字图像识别

    使用ImageMagick和Tesseract进行简单数字图像识别 由于直接使用 tesseract 进行识别,识别率很低, ImageMagick 安装.配置及使用: 平台:winXP 1. 安装I ...

  4. C语言面试题(嵌入式开发方向,附答案及点评)

    整理自C语言面试题(嵌入式开发方向,附答案及点评) 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SEC ...

  5. 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)

    3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...

  6. [转贴]gsoap使用心得!

    最近换了个工作环境,现在在大望路这边上班,呵,刚上班接到的任务就是熟悉gsoap!废话少说,现在开始gSoap学习! gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在W ...

  7. ANDROID_MARS学习笔记_S04_004_用HTTPCLENT发带参数的get和post请求

    一.代码 1.xml(1)activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  8. 解决qt5窗口不刷新(测试窗口类型,测试窗口属性)

    QApplication::notify #if QT_VERSION >= 0x050000        if (QEvent::Show == pEvent->type())     ...

  9. TDBGrideh表头自动排序设置

    自动显示标题行的升降排序标志符(▽降序△升序)并做相应排序DBGridEh组件可以在标题行单元格中显示小三角形升.降排序标志符图片,在运行时可点击标题行,图片自动切换并做相应排序. 具体属性设置如下: ...

  10. 启动redis出现Creating Server TCP listening socket *:6379: bind: No such file or directory

    E:\redis>redis-server.exe redis.windows.conf [8564] 10 Oct 20:00:36.745 # Creating Server TCP lis ...