hdu 2821 Pusher(dfs)
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)的更多相关文章
- hdu 2821 Pusher (dfs)
把这个写出来是不是就意味着把 http://www.hacker.org/push 这个游戏打爆了? ~啊哈哈哈 其实只要找到一个就可以退出了 所以效率也不算很低的 可以直接DFS呀呀呀呀 ...
- HDU 5965 扫雷(dfs)题解
题意:给你一个3*n的格子,中间那行表明的是周围8格(当然左右都没有)的炸弹数量,上下两行都可以放炸弹,问你有几种可能,对mod取模 思路:显然(不),当i - 1和i - 2确定时,那么i的个数一定 ...
- HDU 1518 Square(DFS)
Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...
- HDU 1015 Safecracker (DFS)
题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...
- Hdu 1175 连连看(DFS)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...
- HDU 1501 Zipper(DFS)
Problem Description Given three strings, you are to determine whether the third string can be formed ...
- HDU 5305 Friends(dfs)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
- HDU 5934 Bomb(炸弹)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
随机推荐
- 10g和11g,优化器对外连接的处理对比
我反省,今天面试有个问题没有说清楚.我给出的结论(而且这个结论我验证过)是:不要使用不必要的外连接,举了下面这个例子却没有说清楚.虽然最近感冒,状态不是很好,但最擅长的东西都没有表达清楚,泪流满面啊: ...
- jedis源码阅读
package redis.clients.jedis; import java.util.ArrayList; import java.util.HashSet; import java.util. ...
- 【技术贴】解决QQ空间发表文章手机不显示换行
采用HTML模式,在需要换行的地方加入如下代码. <div><span style="font-family:微软雅黑;font-size:16px"> & ...
- C++内存管理(超长,例子很详细,排版很好)
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- Mono for Android 优势与劣势
原文:Mono for Android 优势与劣势 最近有兴趣了解一下Mono for Andriod,也就是使用.NET平台来开发Andriod程序.Mono for Android API 几乎映 ...
- leetcode面试准备:Valid Anagram
leetcode面试准备:Valid Anagram 1 题目 Given two strings s and t, write a function to determine if t is an ...
- IP处理函数inet_aton()和inet_ntoa(),inet_pton,inet_ntop
inet_ntoa: 功能: 将一个IP转换成一个互联网标准点分格式的字符串. 原型: char FAR * inet_ntoa( struct in_addr in); 返回值: 如果正确,返回一个 ...
- 产品设计中先熟练使用铅笔 不要依赖Axure
在互联网产品领域,Axure已成为产品经理.产品设计师以及交互设计师的必备工具,从某种程度讲,Axure帮助我们建立低保真模型,便于与用户的需求验证,也帮助我们构思交互细节,使前端和开发人员更容易理解 ...
- check约束条件
--约束:对列的值起一个约束性的作用,规定列的值的范围 --主键.外键.非空.自增长标识列.唯一列(unique).check约束 --check 约束 --在某个表里点击右键→设计→进去找到要约束的 ...
- BZOJ3323: [Scoi2013]多项式的运算
3323: [Scoi2013]多项式的运算 Time Limit: 12 Sec Memory Limit: 64 MBSubmit: 128 Solved: 33[Submit][Status ...