申请会员ID:longlongtime
1、申请ID:longlongtime2、个人邮箱:robot1497833202@163.com
3、原创技术文章:本人是学生,学习C++。没有发表过文章。我参加过2019CCF高级测试。本人来到我爱破解主要是为了学习软件的脱壳与病毒的分析。个人学习C++已经很多年,懂得C++中的算法与数据结构,接下来,我分享一下我的知识。
C++比较重要的算法是搜索算法与动态规划。今天我来讲一下搜索算法中的递归与回溯算法。
搜索比较常见的题型便是走迷宫。
设一个n*n的迷宫(2<n<10)出入口分别在左上角和右上角。迷宫格子分为1,0,1代表障碍物,0可以通过,寻找从左上角到右下角的路径(不能重复),输出路径总数,如果无法到达,输出0.
本题主要思考的是回溯思路。
可以向八个方向走,x,y 的增减量是固定的。所以可以在一个数组中定义。
int zuobiao={{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;
bool numb;
int zuobiao={{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;
int goskiing(int x,int y)
{
int max=0;
if(y==r&&x==1) return 1;
if(!num) return 0;
for(int i=1;i<=8;i++)
{
if(num]])
{
num=0;
max+=goskiing(x+zuobiao,y+zuobiao);
num=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=1;
}
cout<<goskiing(1,1);
return 0;
}
可以下载到本地,运行。
输入:
3
0 0 0
0 1 1
1 0 0
输出:
2
希望在论坛里学习与进步,谢谢。
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
页:
[1]