分治算法相关知识
树图思维导图提供 分治法3 在线思维导图免费制作,点击“编辑”按钮,可对 分治法3 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:2fbbddc70f0040125a3b7a800c3f0441
分治法3思维导图模板大纲
划分地盘
思路
分析样例可知,这两个边长存在两种情况1.能够整除2.不能够整除。所以我们在递归函数里就分两种这两种情况来做
核心代码
long long dg(long long x,long long y){ if(x%y==0) return x/y; return dg(y,x%y)+x/y; }
移动棋子2
思路
这题比较水,稍加推理可知就是从1加到n-1,所以直接输出就行了
双色汉诺塔
思路
又是一道水题,模拟一下就可以发现与单色汉诺塔并没有区别,把输出方法改一下就行了
核心代码
void hanoi(int n,char a,char b,char c){ if(n==0) return; hanoi(n-1,a,c,b); cout<<n<<" "<<a<<" "<<b<<endl; hanoi(n-1,c,b,a); }
1315:【例4.5】集合的划分
思路
在经过思考后,可以发现当前节点a[i]只会有两种可能性,一种是自己独自占一个集合,另一种是凑进已有的盒子中,但这里要注意一个点,就是当前已经有k个盒子,所以结果还要乘k。然后再来考虑边界:当节点数=盒子数或盒子只剩下一个时,这只会存在一种可能性;当盒子或节点数为0或当节点数小于盒子数时(因为不能存在盒子数),结果为0
核心代码
long long dg(int n,int k){ if(n==k||k==1) return 1; if(k==0||n==0||n<k) return 0; return dg(n-1,k-1)+dg(n-1,k)*k; }
宇宙的尺度
思路
在经过分析样例后,可以得知每一个大部分都由五个小部分组成,找出每个小部分的起始点就可以递归分别便利,当分解到最小的部分,也就是为1时,直接赋值
代码
#include<bits/stdc++.h> using namespace std; char a[730][730]; void dg(int n,int x,int y){ if(n==1){ a[x][y]='X'; return ; } int l=pow(3,n-2); dg(n-1,x,y); dg(n-1,x+2*l,y); dg(n-1,x+2*l,y+2*l); dg(n-1,x+l,y+l); dg(n-1,x,y+2*l); } int main(){ int x; while(1){ cin>>x; if(x==-1) break; dg(x,1,1); for(int i=1;i<=pow(3,x-1);i++){ for(int j=1;j<=pow(3,x-1);j++){ if(a[i][j]!='X') cout<<' '; else cout<<a[i][j]; } cout<<endl; } cout<<'_'<<endl; } return 0; }
树图思维导图提供 1113爆卡会总结会会议纪要 在线思维导图免费制作,点击“编辑”按钮,可对 1113爆卡会总结会会议纪要 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:aaf6c152a765d5821e8e1787f2b3226e
树图思维导图提供 抓住重点 在线思维导图免费制作,点击“编辑”按钮,可对 抓住重点 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:4c49e4799ddf94a339c56e46eb96a826