分治与递归
分治:大化小
递归:函数不断调用自己本身,未返回的就等待,直到规模减小到边界条件后返回
这俩思想相辅相成,缺一不可。
下面用这个思想解决洛谷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,递归结束。