吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3598|回复: 1
收起左侧

[会员申请] 申请会员ID:longlongtime

[复制链接]
吾爱游客  发表于 2020-2-27 11:38
1、申请ID:longlongtime
2、个人邮箱:robot1497833202@163.com
3、原创技术文章:本人是学生,学习C++。没有发表过文章。我参加过2019CCF高级测试。本人来到我爱破解主要是为了学习软件的脱壳与病毒的分析。个人学习C++已经很多年,懂得C++中的算法与数据结构,接下来,我分享一下我的知识。
C++比较重要的算法是搜索算法与动态规划。今天我来讲一下搜索算法中的递归与回溯算法。
搜索比较常见的题型便是走迷宫。
设一个n*n的迷宫(2<n<10)出入口分别在左上角和右上角。迷宫格子分为1,0,1代表障碍物,0可以通过,寻找从左上角到右下角的路径(不能重复),输出路径总数,如果无法到达,输出0.

本题主要思考的是回溯思路。
可以向八个方向走,x,y 的增减量是固定的。所以可以在一个数组中定义。
int zuobiao[3][9]={{0,0,0,0,0,0,0,0,0},{0,1,0,-1,0,-1,-1,1,1},{0,0,1,0,-1,-1,1,-1,1}};

递归方法:
S1:进入函数;
S2:寻找可以走的方向,向前进一步;有方向判断是不是右下角,是调到P;不是继续S1;
S3:没有路径返回。

P:返回1个路径;

程序如下:
#include<iostream>
using namespace std;
int num[1001][1001];
bool numb[1001][1001];
int zuobiao[3][9]={{0,0,0,0,0,0,0,0,0},{0,1,0,-1,0,-1,-1,1,1},{0,0,1,0,-1,-1,1,-1,1}};
int r;
int last[3];

int goskiing(int x,int y)
{
        int max=0;
        if(y==r&&x==1) return 1;
        if(!num[x][y]) return 0;
        for(int i=1;i<=8;i++)
        {
                if(num[x+zuobiao[1]][y+zuobiao[2]])
                {
                        num[x][y]=0;
                        max+=goskiing(x+zuobiao[1],y+zuobiao[2]);
                        num[x][y]=1;
                }
        }
        return max;
}

int main()
{
        cin>>r;
        int ls;
        for(int i=1;i<=r;i++)
                for(int j=1;j<=r;j++)
                {
                        cin>>ls;
                        if(ls==0) num[j]=1;
                }
        cout<<goskiing(1,1);
        return 0;
}
可以下载到本地,运行。
输入:
3
0 0 0
0 1 1
1 0 0

输出:
2
希望在论坛里学习与进步,谢谢。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2020-2-28 13:46
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表