分治法知识大纲
树图思维导图提供 分治法2 在线思维导图免费制作,点击“编辑”按钮,可对 分治法2 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e44f1dcb891213c91e9ef318e6bc8367
分治法2思维导图模板大纲
1325:循环比赛日程表
思路
把要输出的大正方形分解,先把(1,1)赋值为1,然后扩展开成一个2*2的正方形,可以看出是向右+1(2^0),向下+1,再向右下复制一个。再把2*2扩展成4*4,先是整个2*2的正方形+2(2^1)往右和下复制,再向右下复制一个一样的,以此类推。得出规律为每次将小正方形整个乘2的k-1次方(k为边长),向下向右复制,再把这个小正方形复制到右下角
核心代码
for(int k=1;k<=m;k++){//k为边长 for(int i=1;i<=x;i++){ for(int j=1;j<=x;j++){ a[i][j+x]=a[i][j]+x;//右 a[i+x][j]=a[i][j+x];//下 a[i+x][j+x]=a[i[j];//右下 } } x*=2; }
1326:取模运算
做法
定义一个a初始值为1,循环p次,每次将a*b%p,最后按照格式输出
核心代码
for(long long i=1;i<=p;i++) a=a*b%k;
1205:汉诺塔问题
思路
将整个挪盘过程分解,分解成n个盘从原柱经过过渡柱全部挪到目标柱,分解途中打印出这个过程
核心代码
void hanoi(int n,char a,char b,char c){ if(n==0) return ;//边界 hanoi(n-1,a,c,b); printf("%c->%d->%c\n",a,n,b); hanoi(n-1,c,b,a); }
移动棋子1
思路
先按照题目给的n为4时候挪动棋子步骤,接接着画图模拟后面的过程,可以总结出规律,将第k个和第k+1的位置上棋子挪到第2k+1和2(k+1)的位置上,再将第2k-1和2k位置上的棋子挪到第k和k+1的位置上,然后将k-1,继续按照这个操作
核心代码
void dg(int k){ if(k==4){ cout<<"4,5-->9,10"<<endl; cout<<"8,9-->4,5"<<endl; cout<<"2,3-->8,9"<<endl; cout<<"7,8-->2,3"<<endl; cout<<"1,2-->7,8"<<endl; } else{ cout<<k<<","<<k+1<<"-->"<<2*k+1<<","<<2*(k+1)<<endl; cout<<2*k-1<<","<<2*k<<"-->"<<k<<","<<k+1<<endl; dg(k-1); } }