DFS-hdu-2821-Pusher
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2821
题目意思:
给一个n*n的矩阵,里面有些位置是空的,有些位置有箱子(a代表一个箱子,b代表两个,依此类推)。让你选择一个空位置作为起点,然后每步选择一个方向(上,下,左,右)走,直到碰到箱子为止,然后将此位置的箱子移走一个,剩下的箱子全部合并到下一位置。要求:必须与箱子隔超过1个位置的时候才能移。
求一个开始位置使得能够移除所有的箱子,并输出行走路线。
经数据检测两点注意:1、不含边缘位置超过一个箱子的情况,2、保证有解。
解题思路:
枚举开始位置,DFS深搜,有一条路径能全部移走箱子,则输出。
注意保存回溯现场(不要用全局变量来保存现场,因为在递归调用的时候会覆盖原来保存的现场,wa了好几次)。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/ char save[30][30],save1[30][30];
int c,r,dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int lim,cnt;
char di[4]={'U','R','D','L'}; struct Inf
{
int x,y;
}s; bool iscan(Inf & tt,int dd)
{
int xx=tt.x+dir[dd][0],yy=tt.y+dir[dd][1]; if(xx<0||xx>=r||yy<0||yy>=c) //下一步出界了,不行
return false;
if(save1[xx][yy]!='.') //下一步就是箱子不行
return false;
while(save1[xx][yy]=='.') //在该方向走,直到靠近箱子为止
{
xx=xx+dir[dd][0],yy=yy+dir[dd][1];
if(xx<0||xx>=r||yy<0||yy>=c)//走出去了,不行
return false;
}
if(save1[xx][yy]=='a')//该位置只有一个箱子
{
cnt++;
save1[xx][yy]='.';
tt.x=xx,tt.y=yy;
return true;
}
else //该位置有多个箱子
{
int x=xx+dir[dd][0],y=yy+dir[dd][1];
if(x<0||x>=r||y<0||y>=c) //边缘有多个箱子的情况
{
//cnt++;
//tt.x=xx,tt.y=yy;
//save1[xx][yy]=save1[xx][yy]-1;
//return true; //两种写法都可以,其他写法也行,因为测试数据中不存在这种情况
return false;
}
cnt++;
tt.x=xx,tt.y=yy;
if(save1[x][y]!='.') //下一位置如果不是.的话,直接合并
save1[x][y]=save1[x][y]+save1[xx][yy]-'a';//注意-'a'
else //下一位置是.的话,直接拿过来
save1[x][y]=save1[xx][yy]-1;
save1[xx][yy]='.';
return true;
}
}
bool flag;
string an; void dfs(Inf cur,string ans)
{
if(flag) //已找到一条路径
return ;
char tt[30][30];//注意保存现场时要用局部变量
for(int i=0;i<4;i++) //沿四个方向走
{
memcpy(tt,save1,sizeof(save1));
Inf tmp=cur;
int temp=cnt; //便于回溯的时候,其他没有改变
/*if(test)
{
for(int j=0;j<r;j++)
printf("%d %s\n",j,save1[j]);
}*/
if(!iscan(tmp,i))
continue;
/* if(test)
{
printf("%d %d->%d %d cnt:%d\n",cur.x,cur.y,tmp.x,tmp.y,cnt);
putchar('\n');
for(int j=0;j<r;j++)
printf("%d %s\n",j,save1[j]);
}*/
string tm=ans;
tm+=di[i];
if(cnt==lim) //找到了一条路径能全部移完
{
an=tm;
flag=true;
return ;
}
dfs(tmp,tm);
cnt=temp; //回溯
memcpy(save1,tt,sizeof(tt));
}
} int main()
{
while(~scanf("%d%d",&c,&r))
{
lim=0;
for(int i=0;i<r;i++)
{
scanf("%s",save[i]);
for(int j=0;j<c;j++)
if(save[i][j]!='.')
lim+=(save[i][j]-'a'+1); //统计箱子个数
}
//putchar('\n');
flag=false;
for(int i=0;i<r&!flag;i++)
for(int j=0;j<c&&!flag;j++)
{
if(save[i][j]!='.') //枚举开始位置,注意开始位置不为
continue;
s.x=i,s.y=j;
cnt=0;
memcpy(save1,save,sizeof(save));
dfs(s,"");
if(flag)
{
printf("%d\n%d\n",i,j);
cout<<an<<endl;
}
}
}
return 0;
}
DFS-hdu-2821-Pusher的更多相关文章
- hdu 2821 Pusher(dfs)
Problem Description PusherBoy is an online game http://www.hacker.org/push . There is an R * C grid, ...
- hdu 2821 Pusher (dfs)
Pusher Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others)Total Subm ...
- hdu 2821 Pusher (dfs)
把这个写出来是不是就意味着把 http://www.hacker.org/push 这个游戏打爆了? ~啊哈哈哈 其实只要找到一个就可以退出了 所以效率也不算很低的 可以直接DFS呀呀呀呀 ...
- HDU 2821 Pusher
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 首先,题目描述给的链接游戏很好玩,建议先玩几关,后面越玩越难,我索性把这道题A了,也就相当于通关 ...
- hdu 2821(dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 思路:一开始的时候没注意到,必须从map[i][j]==0的位置开始,然后就是dfs了,回溯的时 ...
- hdu 2821 学习一点dfs的小技巧吧。。 还是自己太弱了
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int r,c ...
- DFS hdu 1016
http://acm.hdu.edu.cn/showproblem.php?pid=1016 #include <iostream> using namespace std; int a[ ...
- 变形课(DFS hdu 1181)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submis ...
- Tree and Permutation dfs hdu 6446
Problem Description There are N vertices connected by N−1 edges, each edge has its own length.The se ...
- DFS || HDU 2181
题意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每 ...
随机推荐
- Cocos发展Visual Studio下一个libcurl图书馆开发环境的搭建
我们解释win32在Visual Studio下一个libcurl图书馆开发环境的搭建.Cocos2d-x发动机实际上与Win32在访问libcurl库.Cocos2d-x 3.x在libcurl库文 ...
- 查看.a架构文件
苹果公司现在要求所有新提交的评论app,我们必须支持64位架构.而我们的在线项目编制,操作员做了一堆SDK在需要访问,我们发现,在这个过程中,有些SDK的.a文件进入后,链接错误,如提示 Undefi ...
- maven snapshot和release版本号之间的差
在使用maven过程.我们经常会在不稳定的状态有很多公共图书馆在发展阶段.需要改变在任何时间和公布,你可能有一天一次发布.经验bug时间,甚至一天公布N次要.我们知道,.maven依赖管理是基于管理的 ...
- Windows 8实例教程系列 - 理解应用框架
原文:Windows 8实例教程系列 - 理解应用框架 Windows 操作系统之所以风靡世界,是因为其“易学易用”,从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windo ...
- iOS pragma mark要使用
郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 简单的来说 ...
- [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)
原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...
- 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构
前几天向大家介绍了一种用工具类生成数据表的方法,只是之前的方法须要使用一个跟项目关系不大的工具类.不免让人认为有些多余,所以呢.今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...
- [LeetCode] Search in Rotated Sorted Array II [36]
称号 Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...
- UVa10986_Sending email(最短)(白皮书图论的话题)
解决报告 思路: 裸裸的最短路. #include <iostream> #include <cstring> #include <cstdio> #include ...
- HDU 1710-Binary Tree Traversals(二进制重建)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...