分治与递归初体验----适合小白理解

    技术2025-11-03  41

    分治与递归

    分治:大化小 递归:函数不断调用自己本身,未返回的就等待,直到规模减小到边界条件后返回 这俩思想相辅相成,缺一不可。 下面用这个思想解决洛谷P5461 赦免战俘

    原题目 (https://www.luogu.com.cn/problem/P5461)

    AC代码:

    #include<stdio.h> #include<math.h> void di(int,int,int); int list[1025][1025]; int main() { int n,i,j,p; scanf("%d",&n); p=pow(2,n); for(i=0;i<=p-1;++i) { for(j=0;j<=p-1;++j) { list[i][j]=1; } } di(p,0,0); for(i=0;i<=p-1;++i) { for(j=0;j<=p-2;++j) { printf("%d ",list[i][j]); } printf("%d\n",list[i][p-1]); } return 0; } void di(int x,int a,int b) { int i,j; if(x==2) { list[a][b]=0; return ; } else { for(i=a;i<=x/2-1+a;++i) { for(j=b;j<=x/2-1+b;++j) { list[i][j]=0; } } di(x/2,a+x/2,b); di(x/2,a,b+x/2); di(x/2,a+x/2,b+x/2); } }

    解释: 当n=4时,如图,白色=1,其他颜色=0 对于每一个正方形,都可以分成4个正方形,左上那个都是0,其余的三个都相同,可以继续分成4个小正方形,左上为0,直到边长为2时,左上为0,其余的三个全部为1,递归结束。

    Processed: 0.013, SQL: 9