`
mayi_hetu
  • 浏览: 15579 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poj3009 深搜

    博客分类:
  • poj
阅读更多

/*

简单的深搜,需要注意题意里一点,如果一开始就遇到墙壁,则不能往该方向移动

*/

#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 1696(叉积+深搜)

    描述中提到的“叉积+深搜”,指的是在解决这个问题时可能用到的两种技术。叉积是向量运算的一种,用于判断两个向量的方向关系,也可以用来计算两个向量构成的角的大小。在计算几何中,叉积常用于判断点的位置关系、...

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    深搜+宽搜+剪枝 配合POJ题目

    各种搜索算法,配合POJ上的题目,含标程,及各题解题思路。

    POJ 1979 Red and Black(广搜与深搜两种解答)

    标题“POJ 1979 Red and Black”是一个编程竞赛题目,主要涉及的问题是算法设计,特别是搜索算法。在这个问题中,广度优先搜索(BFS)和深度优先搜索(DFS)这两种策略被用来解决特定的红黑树相关的问题。红黑树是一...

    图的深搜+回溯练习题:POJ2197

    标题中的“图的深搜+回溯练习题:POJ2197”是指一个编程题目,主要涉及图论中的深度优先搜索(DFS, Depth First Search)和回溯算法的应用。这个题目来源于在线编程竞赛平台POJ(Problem Online Judge),编号为2197...

    poj2488.rar_poj24_poj2488_方向模板法

    “在深搜过程中的方向问题”则指的是在深度优先搜索(DFS,Depth-First Search)中遇到的方向选择。深度优先搜索是一种遍历或搜索树(或图)的算法,通常采用栈数据结构来实现。在解决某些问题时,特别是在使用回溯...

    深搜宽搜与剪枝分析与poj具体程序举例

    本文主要探讨了两种基础的搜索算法——深度优先搜索(DFS)和宽度优先搜索(BFS),以及剪枝策略,并通过POJ平台上的实例进行了分析。 1. **搜索算法基本概念** - **状态(state)**:表示问题在某个时间点的进展...

    POJ_keptsl6_C++_

    描述中的“动态规划、深搜广搜等算法”提到了两种重要的算法类别。动态规划(Dynamic Programming, DP)是一种在计算机科学中解决问题的方法,它通过将复杂问题分解为子问题来求解,通常用于优化问题和计算问题。深度...

    【POJ1330】最近公共祖先(LCA):并查集+深搜 - cxllyg的专栏 - 博客频道 - CSDN.NET1

    【最近公共祖先(LCA)问题详解】 最近公共祖先(Lowest Common Ancestor,简称LCA)是指在一颗树中,两个指定节点的最近的共同祖先。这个问题在计算机科学,尤其是数据结构和算法领域中非常常见,特别是在处理...

    深搜相关题解1

    【深搜相关题解】 深度优先搜索(Deep First Search, DFS)是一种用于遍历或搜索树或图的算法。在图或树结构中,DFS会尽可能深地探索节点的子树,直到达到叶子节点,然后回溯到最近的未访问节点,继续探索其他分支...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    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 字典序...

Global site tag (gtag.js) - Google Analytics