/*
简单的深搜,需要注意题意里一点,如果一开始就遇到墙壁,则不能往该方向移动
*/
#include<stdio.h>
#include<string.h>
#define MAX 50
int map[MAX][MAX];
int w,h,result;
int start_i,start_j,end_i,end_j;
int d[][2]={ {0,-1}
,{-1,0}
,{0,1}
,{1,0}
};
void dfs(int i,int j,int step)
{
int k,next_i,next_j;
if(step>=result)return;
step++;
for(k=0; k<4; ++k)
{
next_i = i+d[k][0];
next_j = j+d[k][1];
//You may throw it to any direction unless it is blocked immediately
//如果一开始就是墙壁则不能破开
if(next_i<0 || next_i>h || next_j<0 || next_j>w || map[next_i][next_j]==1)continue;
while(next_i>=0 && next_i<h && next_j>=0 && next_j<w && map[next_i][next_j]==0 )
{
next_i += d[k][0];
next_j += d[k][1];
}
if(next_i<0 || next_i>=h || next_j<0 || next_j>=w)continue;
if(map[next_i][next_j]==3)
{
if(step<result)result=step;
return;
}
if(map[next_i][next_j]==1)
{
map[next_i][next_j]=0;
dfs(next_i-d[k][0], next_j-d[k][1], step);
map[next_i][next_j]=1;
}
}
}
int main()
{
int i,j;
freopen("data","r",stdin);
while( scanf("%d %d",&w,&h),w!=0 && h!=0 )
{
memset(map,0,sizeof(map));
result = 11;
for(i=0; i<h; ++i)
{
for(j=0; j<w; ++j)
{
scanf("%d",&map[i][j]);
if( map[i][j]==2 )
{
start_i = i;
start_j = j;
map[i][j]=0;
}else if( map[i][j]==3 )
{
end_i = i;
end_j = j;
}
}
}
dfs(start_i,start_j,0);
if(result>10)printf("-1\n");
else printf("%d\n",result);
}
return 0;
}
分享到:
相关推荐
描述中提到的“叉积+深搜”,指的是在解决这个问题时可能用到的两种技术。叉积是向量运算的一种,用于判断两个向量的方向关系,也可以用来计算两个向量构成的角的大小。在计算几何中,叉积常用于判断点的位置关系、...
标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...
各种搜索算法,配合POJ上的题目,含标程,及各题解题思路。
标题“POJ 1979 Red and Black”是一个编程竞赛题目,主要涉及的问题是算法设计,特别是搜索算法。在这个问题中,广度优先搜索(BFS)和深度优先搜索(DFS)这两种策略被用来解决特定的红黑树相关的问题。红黑树是一...
标题中的“图的深搜+回溯练习题:POJ2197”是指一个编程题目,主要涉及图论中的深度优先搜索(DFS, Depth First Search)和回溯算法的应用。这个题目来源于在线编程竞赛平台POJ(Problem Online Judge),编号为2197...
“在深搜过程中的方向问题”则指的是在深度优先搜索(DFS,Depth-First Search)中遇到的方向选择。深度优先搜索是一种遍历或搜索树(或图)的算法,通常采用栈数据结构来实现。在解决某些问题时,特别是在使用回溯...
本文主要探讨了两种基础的搜索算法——深度优先搜索(DFS)和宽度优先搜索(BFS),以及剪枝策略,并通过POJ平台上的实例进行了分析。 1. **搜索算法基本概念** - **状态(state)**:表示问题在某个时间点的进展...
描述中的“动态规划、深搜广搜等算法”提到了两种重要的算法类别。动态规划(Dynamic Programming, DP)是一种在计算机科学中解决问题的方法,它通过将复杂问题分解为子问题来求解,通常用于优化问题和计算问题。深度...
【最近公共祖先(LCA)问题详解】 最近公共祖先(Lowest Common Ancestor,简称LCA)是指在一颗树中,两个指定节点的最近的共同祖先。这个问题在计算机科学,尤其是数据结构和算法领域中非常常见,特别是在处理...
【深搜相关题解】 深度优先搜索(Deep First Search, DFS)是一种用于遍历或搜索树或图的算法。在图或树结构中,DFS会尽可能深地探索节点的子树,直到达到叶子节点,然后回溯到最近的未访问节点,继续探索其他分支...
1.16.17 pku3668_GameofLine_N个点最多确定多少互不平行的直线(poj3668) 99 1.16.18 求凸多边形直径 100 2.组合 102 2.1 组合公式 102 2.2 排列组合生成 102 2.3 生成gray码 104 2.4 置换(polya) 104 2.5 字典序...