递归之小游戏

作者: cherryleechen | 来源:发表于2017-10-03 20:36 被阅读4次

问题描述

2017-10-03 19-08-13 创建的截图.png 2017-10-03 19-08-26 创建的截图.png 2017-10-03 19-08-32 创建的截图.png 2017-10-03 19-08-36 创建的截图.png 2017-10-03 19-08-56 创建的截图.png 2017-10-03 19-09-00 创建的截图.png 2017-10-03 19-09-10 创建的截图.png

问题分析

2017-10-03 19-13-59 创建的截图.png 2017-10-03 19-14-12 创建的截图.png 2017-10-03 19-14-15 创建的截图.png 2017-10-03 19-14-18 创建的截图.png 2017-10-03 19-14-28 创建的截图.png 2017-10-03 19-14-30 创建的截图.png 2017-10-03 19-14-33 创建的截图.png

程序实现

#include<iostream>
#include<cstring>
using namespace std;

const int MAXN=75;

char board[MAXN+2][MAXN+2];//定义矩形板
int mark[MAXN+2][MAXN+2];//定义标记数组
int direc[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};//定义方向

int w,h,minSteps;

void searchPath(int curX,int curY,int tarX,int tarY,int steps,int preDirec)
    {
//X方向上下,Y方向左右
    if(steps>minSteps) return;//当前路径数大于minSteps,返回------优化策略
    if((curX==tarX)&&(curY==tarY)) {//到达终点
            if(minSteps>steps) minSteps=steps;//更新最小路径数
            return;
            }
    for(int i=0; i<4; i++) {//枚举下一步的方向
            int X=curX+direc[i][0];//得到新的位置
            int Y=curY+direc[i][1];
            if((X>-1&&X<h+2&&Y>-1&&Y<w+2)&&((mark[X][Y]==0&&board[X][Y]==' ')||((X==tarX)&&(Y==tarY)&&board[X][Y]=='X'))) {
                    mark[X][Y]=1;
                    //上一步方向和当前方向相同,则递归搜索时steps不变,否则steps+1
                    if(i==preDirec) searchPath(X,Y,tarX,tarY,steps,i);
                    else searchPath(X,Y,tarX,tarY,steps+1,i);
                    mark[X][Y]=0;//回溯,该位置未曾走过
                    }
            }
    }

int main()
    {
    int countsB=0;
    while(cin>>w>>h) {
        if(w==0&&h==0) break;
        countsB++;
        cout<<"Board #"<<countsB<<":"<<endl;
        memset(board,' ',sizeof(board));
        for(int i=1; i<h+1; i++){
            getchar();//读入换行符
        for(int j=1; j<w+1; j++)
            board[i][j]=getchar();
            }
        int countsXY=0;
        int x1,y1,x2,y2;
        while(cin>>y1>>x1>>y2>>x2) {
            if(x1==0&&y1==0&&x2==0&&y2==0) break;
            memset(mark,0,sizeof(mark));
            minSteps=10000000;//初始化minSteps为一个很大的值
            countsXY++;
            searchPath(x1,y1,x2,y2,0,-1);
            if(minSteps==10000000)
                cout<<"Pair "<<countsXY<<":"<<" impossible."<<endl;
            else
                cout<<"Pair "<<countsXY<<": "<<minSteps<<" segments."<<endl;
            }
        cout<<endl;
        }
    return 0;
}

运行结果

2017-10-03 20-34-06 创建的截图.png

小结

2017-10-03 19-14-43 创建的截图.png

相关文章

  • 递归之小游戏

    问题描述 问题分析 程序实现 运行结果 小结

  • 二、递归(一)

    一、基本思想 二、 实例-小游戏 【相关文档】1.老生常谈,正确使用memset2.递归-小游戏(算法基础 第3周...

  • iOS 动画实战之钓鱼小游戏

    iOS 动画实战之钓鱼小游戏 iOS 动画实战之钓鱼小游戏

  • Python精简入门学习(十)

    Python精简入门学习之递归函数-递归 -递归 -如图所示

  • Python 入门之 递归

    Python 入门之 递归 1、递归: 递:一直传参 归:返回 (1)不断调用自己本身(无效递归 -- 死递归) ...

  • 拾荒之--童年小游戏1

    拾荒之--童年小游戏1

  • 数据结构之递归

    数据结构之递归 1.递归的概念 简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解...

  • 详解什么是尾递归(javascript版本)

    在传统的递归中,典型的模型是首先执行递归调用,然后获取递归调用的返回值并计算结果。以这种方式,在每次递归调用返回之...

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • Python学习之路(递归函数)

    函数之 递归函数 小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通...

网友评论

    本文标题:递归之小游戏

    本文链接:https://www.haomeiwen.com/subject/hjpfyxtx.html