POJ2802小游戏_kbb0824的博客-程序员宅基地

技术标签: POJ  

题目描述:
读入一个矩阵,0表示可以通过,1表示不可以通过,矩阵周围的一圈也可以通过。任意给两个点A,B,判断是否能从A到达B,若能到达,输出所有路径中拥有折线段数最少的那个。
别人的程序:
想法是DFS+剪枝,用方向的改变次数来计算折线段数。DFS函数参数为:本次访问的点,已有的折线段数,方向。

  1. 在函数的开始判断是否当前路径的折线段数已经超过了最少的那条(剪枝),超过则返回。
  2. 然后判断是否到达了终点,由于比当前更长的路径已经返回了,所以能到达终点的路径的折线段数一定是最短的,直接记录并返回即可。
  3. 然后依次访问四个方向,在进入之前判断是否在界限内,是否可以走且未被访问过,或者是最后一个点(因为最后一个点实际上是不允许通行的,不然就无法到达终点了)
  4. 若能访问,则标记这个点被访问过,访问(进入递归函数),恢复这个点为未被访问过(因为要求的是最优解,可能有多条路径,之后还会访问这个点)
  5. 这种写法进入第一个点时是不需要判断的,一定可以进入。
#include <iostream>
#include <stdio.h>
using namespace std;
#include <memory.h>
#define MAXIN 75
 
char board[MAXIN+2][MAXIN+2];
int minstep,w,h,to[4][2]={
    {
    1,0},{
    0,1},{
    -1,0},{
    0,-1}};
bool mark[MAXIN+2][MAXIN+2];
 
void Search(int now_x,int now_y,int end_x,int end_y,int step,int f){
    
    if(step>minstep) return;
    if(now_x == end_x && now_y == end_y){
    
            minstep = step;
            return;
    }
    for(int i = 0;i<4;i++){
    
        int x = now_x + to[i][0];
        int y = now_y + to[i][1];
        if( ((x>-1) && (x<w+2) && (y>-1) && (y<h+2))
           &&((board[y][x] == ' ' && mark[y][x] == false)||(x == end_x&&y==end_y))){
    
                mark[y][x] = true;
                if(f==i) Search(x,y,end_x,end_y,step,i);
                else Search(x,y,end_x,end_y,step+1,i);
                mark[y][x] = false; //回溯,该位置未曾走过
           }
    }
}
 
int main(){
    
    int Boardnum = 0;
    while(scanf("%d %d",&w,&h)){
    
        if(w==0 && h == 0) break;
        Boardnum++;
        printf("Board #%d:\n",Boardnum);
        int i,j;
        for(i=0;i<MAXIN+2;i++){
    
            board[0][i] = board[i][0] = ' ';
        }
        for(i=1;i <= h;i++){
    
            getchar();
            for(j=1;j<=w;j++) board[i][j] = getchar();
        }
        for(i=0;i<=w;i++)
            board[h+1][i+1] = ' ';
        for(i=0;i<=h;i++)
            board[i+1][w+1] = ' ';
        int begin_x,begin_y,end_x,end_y,count = 0;
        while(scanf("%d %d %d %d",&begin_x,&begin_y,&end_x,&end_y)&&begin_x > 0   ){
    
            count++;
            minstep = 100000;
            memset(mark,false,sizeof(mark));
            Search(begin_x,begin_y,end_x,end_y,0,-1);
            if(minstep<100000) printf("Pair %d: %d segments.\n",count,minstep);
            else printf("Pair %d: impossible.\n",count);
        }
        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39503067/article/details/104718812

智能推荐

在Java代码中解析html,获得其中的值_java取html的值-程序员宅基地

有时我们获取到了页面需要在Java代码中进行解析,获取html中的数据,Jsoup是一个很方便的工具.一、什么是Jsoup? 官网网站:http://jsoup.org/ 可在官网下载对应的jar 通俗的将Jsoup就是一个解析网页的东西二、示例1.页面,通过查询获取到了一些数据:2.源码,这是_java取html的值

大数据_HUE_sasl maxbufsize-程序员宅基地

11、配置和使用HUE一、Demo:启动和使用HUE 1、启动:hadoop:start-all.sh hbase: start-hbase.sh hbase-daemon.sh start thrift hive: hive --service metastore_sasl maxbufsize

c、c++I/O整理(cout、cout.put、cin、cin.get、cin.getline、puts、putchar、printf、gets、getchar、scanf)_count和putchar-程序员宅基地

文章目录函数输出输入函数(cstdio/stdio.h)输出//输出单个字符(包括空格回车),返回输出的字符或EOF(操作失败,下同)int putchar(int ch);//把p所指向的字符串输出(截止至空字符‘\0’,用回车代替‘\0’,即自动换行),返回非负整数或EOFint puts(const char *p);//输出基本数据类型(截止于空格、回车、制表符Tab),返..._count和putchar

修改彩虹六号围攻地区服务器,彩虹六号围攻_Joel Butterly的博客-程序员宅基地

彩虹六号围攻怎么改区?想来很多朋友都还不是很清楚吧,所以呢小编今天给大家带来的就是彩虹六号围攻更换区域方法介绍了,需要的朋友不妨进来看看。彩虹六号围攻更换区域方法要手动选择资料中心地区:• 开启您的档案总管。• 前往:C:\Users\\Documents\My Games\Rainbow Six - Siege\是一组代表你的 Ubisoft 帐户的英数字组合长字串。像这样:如果你的电脑上有登入..._彩虹六号 eastasia改地区

贪心算法解会场安排问题_贪心算法会场安排问题-程序员宅基地

会场安排问题假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。) 对于给定的k个待安排的活动,计算使用最少会场的时间表。Input输入数据的第一行有1 个正整数k(k≤10000),表示有k个待安排的活动。接下来的k行中,每行有2个正整数,分别表示k个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。_贪心算法会场安排问题

随便推点

配置 Windows 环境变量的方法_环境变量设置_暗诺星刻的博客-程序员宅基地

设置Windows环境变量的方法设置Windows中的环境变量是为了某些命令在CMD中可以被识别以及用于多应用之间的交互。设置Windows环境变量的具体操作流程如图(请顺着图片用鼠标点击画红圈部分),下面以环境变量Path为例:..._环境变量设置

如何“以输出倒逼输入”加速自己成长?_输出式倒逼输入式成长-程序员宅基地

转载自:https://www.jianshu.com/p/5aea7cabc642亲,你平时有没有这样的感觉:看到朋友圈一篇好文就内心大喊“喔塞,写得好,今天学到了很多”看到一篇《××大全》长微博立刻收藏起来听到喜马拉雅一段音频课程,满耳的正能量……可是!回到现实中却是一个大写的“然并卵”。为什么会这样呢?一是因为我们每天身处海量的信息轰炸中(信息过载化),二是因为微信、微博、微..._输出式倒逼输入式成长

UE4 用FFastXml解析Xml_ue解析xml报文-程序员宅基地

​解析文件的引用:FFastXml存在于Runtime/XmlParser/Public/FastXml.h头文件中API Document中关于FFastXml的用法说的还是很清楚的,因此,本篇之简要说明一下基本使用规则:首先,你必须实现IFastXmlCallback接口,事实上,你的主要操作就在这个接口提供的5个接口函数中。基于此,继承IFastXmlCallback接口_ue解析xml报文

2021上学期博客目录-程序员宅基地

2021上学期博客目录初始mybatismybatis实现关联查询利用MyBatis实现CRUD操作Spring框架学习笔记01:初探Spring——采用Spring配置文件管理BeanSpring框架学习笔记02:初探Spring——利用组件注解符精简Spring配置文件Spring Boot基础学习笔记:可视化数据vue-cli介绍与安装vue-router(一vue-router基本使用)vue-router(二vue-router动态路由)vue-router

Python for Mac [ Python2.7 & 3.7.4 ]-程序员宅基地

安装 Python3 :$ brew install python3可能会遇到的错误 :Error: An unexpected error occurred during the `brew link` stepThe formula built, but is not symlinked into /usr/localPermission denied @ dir_s_mkdir -...

ROS 进阶学习笔记(17):ROS导航2:关于 move_base Package(底盘移动包)_ros2 movebase-程序员宅基地

== 关于move_base 导航核心包 ==wikipage: http://wiki.ros.org/move_base=== 我学这个包的时候,尽量总结wiki page上的内容如下:===move_base package 所属Stack: navigation关于这个包在 ROS Navigation 框架中的位置,参见:ROS探索总结(十三)——导航与定位框架开_ros2 movebase

推荐文章

热门文章

相关标签