首页
Search
1
欣小逸食用指北
9 阅读
2
北理图集(4.28-5.16)
8 阅读
3
整合包食用说明
8 阅读
4
FydeOS - 适合国内用户使用的Chrome OS系统
2 阅读
5
引用、友元、重载
2 阅读
默认分类
笔记
登录
Search
标签搜索
日常
代码
欣小逸
bot
FydeOS
Electron
sqlite3
自动控制原理
笔记
拾雨
累计撰写
14
篇文章
累计收到
22
条评论
首页
栏目
默认分类
笔记
页面
搜索到
2
篇与
的结果
2022-03-16
引用、友元、重载
引用定义格式type & 名称int a; int &b=a;b和a表示同一个对象注意事项可以使用任何合法的变量名需要立即初始化,不能先定义后赋值不能重新赋值引用作为函数的参数时,传递的是参数本身而不是副本,使用引用传递函数的参数可能会导致形参变化用引用返回值友元允许外面的类和函数访问另一个类的私有成员声明为友元的可以是另一个类的成员函数,也可以是一般函数,也可以是一整个类声明部分在目标类的定义中特性不对称:A是B的友元,B不一定是A的友元不传递:A是B的友元,B是C的友元,A不一定是C的友元不继承:基类的友元不能被派生类继承慎用友元不必要情况下无需使用友元,因为是对封装性的破坏
2022年03月16日
2 阅读
0 评论
0 点赞
2022-03-13
走迷宫
我们需要做的事情:从(1,1)走到(m,n)把这个问题进行分解可以看成,①从(1,1)往八个方向走一步②再从这个点走到(m,n),我们发现,②也是在重复从(1,1)走到(m,n)的过程,直到我们走到(m,n)的位置,然后结束这个过程,告诉前面的点找到(m,n)了(return 1)。因此我们可以使用递归函数,假设函数名是solve(int x,int y),表示从(x,y)走到(m,n),那么我们的函数就可以写成int solve(int x,int y){ if(x==m&&y==n){ return 1; } if(puzzle[x-1][y-1]==0){//左上 if(solve(x-1,y-1)){ return 1; } } if(puzzle[x][y-1]==0){//上方 if(solve(x,y-1)){ return 1; } } if(puzzle[x+1][y-1]==0){//右上 if(solve(x+1,y-1)){ return 1; } } if(puzzle[x+1][y]==0){//右 if(solve(x+1,y)){ return 1; } } if(puzzle[x+1][y+1]==0){//右下 if(solve(x+1,y+1)){ return 1; } } if(puzzle[x][y+1]==0){//下 if(solve(x,y+1)){ return 1; } } if(puzzle[x-1][y+1]==0){//左下 if(solve(x-1,y+1)){ return 1; } } if(puzzle[x-1][y]==0){//左边 if(solve(x-1,y)){ return 1; } } return 0;//如果八个方向都没有找到,说明这个点到不了(m,n) }然而如果我们使用这个函数,我们会发现它陷入了死循环,因为假设我们从(1,1)递归执行solve(2,2),在执行solve(2,2)的过程中,我们又会走到(1,1),然后一直重复在(1,1)和(2,2)之间来回走的过程,陷入死循环,因此,我们需要进行限制,让已经走过的路不再纳入考虑范围里,于是我们可以使用一个visit数组,来表示在这个过程中这个点有没有走过,如果八个方向都不能走,函数会到末尾结束,返回上一个点,相当于后退了一步,所以我们需要把visit标记清除int solve(int x,int y){ visit[x][y]=1;//标记这个点,表示这个点我们已经走过了,之后走的时候不走它 if(x==m&&y==n){ return 1; } if(puzzle[x-1][y-1]==0&&visit[x-1][y-1]==0){//左上,检验可不可以走的时候同时检验这个点有没有走过 if(solve(x-1,y-1)){ return 1; } } if(puzzle[x][y-1]==0&&visit[x][y-1]==0){//上方 if(solve(x,y-1)){ return 1; } } if(puzzle[x+1][y-1]==0&&visit[x+1][y-1]==0){//右上 if(solve(x+1,y-1)){ return 1; } } if(puzzle[x+1][y]==0&&visit[x+1][y]==0){//右 if(solve(x+1,y)){ return 1; } } if(puzzle[x+1][y+1]==0&&visit[x+1][y+1]==0){//右下 if(solve(x+1,y+1)){ return 1; } } if(puzzle[x][y+1]==0&&visit[x][y+1]==0){//下 if(solve(x,y+1)){ return 1; } } if(puzzle[x-1][y+1]==0&&visit[x-1][y+1]==0){//左下 if(solve(x+1,y+1)){ return 1; } } if(puzzle[x-1][y]==0&&visit[x-1][y]==0){//左边 if(solve(x-1,y)){ return 1; } } visit[x][y]=0;//八个点都走不过去,我们退回到上一个点,在这之前,因为我们是往后退了,所以这个点重新标记成我们没有来过 return 0;//如果八个方向都没有找到,说明这个点到不了(m,n) }找路的部分已经写好了,那么我们如何把路径输出呢,我们想到,我们找到(m,n)的时候,return 了 1,之后回到(m,n)的前一个点,在if(solve(x+1,y)){ return 1; }这个语句中又向上一个点返回了1,也就是按照原路一直return 1,所以我们可以在return 1之前加一个输出,输出这个时候的(x,y),就可以把路径输出int solve(int x,int y){ visit[x][y]=1;//标记这个点,表示这个点我们已经走过了,之后走的时候不走它 if(x==m&&y==n){ printf("(%d,%d)\n",x,y); return 1; } if(puzzle[x-1][y-1]==0&&visit[x-1][y-1]==0){//左上,检验可不可以走的时候同时检验这个点有没有走过 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x][y-1]==0&&visit[x][y-1]==0){//上方 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x+1][y-1]==0&&visit[x+1][y-1]==0){//右上 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x+1][y]==0&&visit[x+1][y]==0){//右 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x+1][y+1]==0&&visit[x+1][y+1]==0){//右下 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x][y+1]==0&&visit[x][y+1]==0){//下 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x-1][y+1]==0&&visit[x-1][y+1]==0){//左下 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } if(puzzle[x-1][y]==0&&visit[x-1][y]==0){//左边 if(solve(x+1,y)){ printf("(%d,%d)\n",x,y); return 1; } } visit[x][y]=0;//八个点都走不过去,我们退回到上一个点,在这之前,因为我们是往后退了,所以这个点重新标记成我们没有来过 return 0;//如果八个方向都没有找到,说明这个点到不了(m,n) }
2022年03月13日
0 阅读
1 评论
0 点赞