poj3009 Curling 2.0 深搜
PS:以前看到题目这么长就没写下去了。今天做了半天,没做出来。准备看题解,打开了网站都忍住了,最后还是靠自己做出来的。算是一点进步吧。
分析:
题目的意思没明白或者理解有偏差都没办法做题。看样例3和样例4,数据差不多的,但是一个输出4,但是另外的一个却是-1。再去看题目就会发现,题目的意思是在撞碎石头之前必须走一个为值0的格子。我理解为需要加速。对样例4,答案4是这样出来的:初始位置为(1,3),第一步是到达(1,2),并且使得(1,1)点的值为0(撞碎了这里的石头,0代表可以通行);第二步是到达(1,3),并且是得(1,4)点的值为0;第三步是到达(1,4),并且使得(1,5)的值为0;第四步是到达(1,5),发现到达了终点,结束。样例5也可以这样得到。
样例6错误的原因是因为超过了10步,这是题目的要求,超过10步就当不能到达处理。
这样一来,可以知道了起点和终点的处理了。起点(终点)的坐标记录下来,但是标记为0。
还有就是实现如何对一个方向进行搜索,以及如何标记在撞石头之前已经走过0的位置(不能是这种情况:起点是0,下一点就撞石头)。这思考一下就可以实现了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; void DFS(int x,int y,int di);
const int N=,INF=0x3f3f3f3f;
bool vis[N][N];
int r,c,t,ex,ey,sx,sy,mx;
int dx[]={,,,-};
int dy[]={,-,,};
bool isin(int x,int y)
{
return x>=&&x<r&&y>=&&y<c;
}
void DDFS(int a,int b,int x,int y,int d)
{
int i,j;
if(t>) return ;
i=x+a; j=y+b;
if(!isin(i,j)) return ;
if(!vis[i][j])
{
d=;
if(i==ex&&j==ey)
{
mx=min(t,mx);
}
DDFS(a,b,i,j,d);
}
else if(vis[i][j]&&d)
{
vis[i][j]=;
d=;
t++;
DFS(x,y,d);
t--;
vis[i][j]=;
}
}
void DFS(int x,int y,int d)
{ for(int k=;k<;k++)
{
DDFS(dx[k],dy[k],x,y,d);
}
}
int main()
{
//freopen("test.txt","r",stdin);
while(scanf("%d%d",&c,&r)!=EOF&&c)
{
int x;
for(int i=;i<r;i++){
for(int j=;j<c;j++){
scanf("%d",&x);
if(x==)
{
ex=i;ey=j;
vis[i][j]=;
}
else if(x==)
{
sx=i;sy=j;
vis[i][j]=;
}
else vis[i][j]=x;
}
}
t=;
mx=INF;
DFS(sx,sy,);
if(mx==INF) printf("-1\n");
else printf("%d\n",mx);
}
return ;
}
DFS(x,y,d) : (x,y)是起点的坐标,d是标记是否有经过被标记0的点。1表示经过了,0表示没有。
DDFS(a,b,x,y,d) :(a,b)是方向向量,表明向什么方向搜索;x,y,d同上。
通过d的记录就可以知道石头可不可以撞碎。使用(a,b)就可以沿着同一方向一直深入。
poj3009 Curling 2.0 深搜的更多相关文章
- POJ-3009 Curling 2.0 (DFS)
Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But th ...
- POJ3009——Curling 2.0(DFS)
Curling 2.0 DescriptionOn Planet MM-21, after their Olympic games this year, curling is getting popu ...
- poj3009 Curling 2.0 (DFS按直线算步骤)
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14563 Accepted: 6080 Desc ...
- poj3009 Curling 2.0(很好的题 DFS)
https://vjudge.net/problem/POJ-3009 做完这道题,感觉自己对dfs的理解应该又深刻了. 1.一般来说最小步数都用bfs求,但是这题因为状态记录很麻烦,所以可以用dfs ...
- POJ3009 Curling 2.0
正式做POJ的第一题,做出来后又看了别人的代码,就又完善了一下,也通过了.参考 http://blog.sina.com.cn/s/blog_4abcd9bc0100phzb.html 改了之后觉得写 ...
- POJ3009 Curling 2.0(DFS)
迷宫问题求最短路. 略有不同的是假设不碰到石头的话会沿着一个方向一直前进,出界就算输了.碰到石头,前方石头会消失,冰壶停在原地. 把这个当作状态的转移. DFS能够求出其最小操作数. #include ...
- POJ3009 Curling 2.0(DFS)
题目链接. 分析: 本题BFS A不了. 00100 00001 01020 00000 00010 00010 00010 00010 00030 对于这样的数据,本来应当是 5 步,但bfs却 4 ...
- ACM 海贼王之伟大航路(深搜剪枝)
"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...
- nyoj-20-吝啬的国度(深搜)
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 在一个吝啬的国度里有N个城市.这N个城市间仅仅有N-1条路把这个N个城市连接起来.如今,Tom在第S号城市 ...
随机推荐
- openoffice启动服务并将office文件转换为pdf文件
1.首先下载最新版的openoffice工具,安装完成之后安装服务,, win+r打开命令提示符 输入cmd,cd C:\Program Files (x86)\OpenOffice 4\progra ...
- 第六节:pandas函数应用
1.pipe() :表格函数应用: 2.apply():表格行列函数应用: 3.applymap():表格元素应用.
- dubbo服务telnet命令的使用
转自:https://www.cnblogs.com/feiqihang/p/4387330.html dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本 ...
- Linq表达式写法
Linq表达式,实现按照某个字段排序的简单写法. 做项目的时候遇到的一个简单问题,于是记下来. 列举一个例子: <T> model=new <T>(); 加入model中有要根 ...
- socket状态
SYN_SEND Indicates active open. SYN_RECEIVED Server just received SYN from the client. ESTABLISHED C ...
- 2.3. Configuring sudo Access-RedHat
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/2/html/Get ...
- Spring MVC 注解基础
@Controller @Controller 注解用于标记在 Java 类上.被 @Controller 标记过的类就是一个 SpringMVC Controller对象.DispatcherSer ...
- OpenCV使用GPU
在使用OpenCV2.4.x的时候,以为不用重新编译可以直接使用GPU模块,不过在我使用的时候,发现使用getCudaEnabledDeviceCount()的时候,总是获得是0,于是重新编译Open ...
- iphone照片查看器
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- IntelliJ IDEA 16 EAP新特性一览
IntelliJ IDEA 16 EAP新特性一览 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs IntelliJ I ...