洛谷P5461做题笔记
代码如下:
#include<stdio.h>
#include<math.h>
#define N 1500
int s[N][N];
int cutt(int x1,int x2,int y1,int y2)
{
//printf("x2-x1=%d\n",x2-x1);
for(int i=x1;i<=(x2+x1)/2;i++)
for(int j=y1;j<=(y2+y1)/2;j++)
s[i][j]=0;
if((x2-x1)!=1)
{
cutt((x2+x1)/2+1,x2,(y2+y1)/2+1,y2);
cutt((x2+x1)/2+1,x2,y1,(y2+y1)/2);
cutt(x1,(x2+x1)/2,(y2+y1)/2+1,y2);
}
else
{
s[x1][y1]=0;
return 0;
}
}
int main()
{
int n;
scanf("%d",&n);
int t=pow(2,n);
//printf("%d\n",t);
for(int i=1;i<=t;i++)
for(int j=1;j<=t;j++)
s[i][j]=1;
cutt(1,t,1,t);
for(int i=1;i<=t;i++)
{
for(int j=1;j<=t;j++)
printf("%d ",s[i][j]);
printf("\n");
}
return 0;
}
此题初解有一点没有弄清,关键的步骤在于:
if((x2-x1)!=1)
{
cutt((x2+x1)/2+1,x2,(y2+y1)/2+1,y2);
cutt((x2+x1)/2+1,x2,y1,(y2+y1)/2);
cutt(x1,(x2+x1)/2,(y2+y1)/2+1,y2);
}
else
{
s[x1][y1]=0;
return 0;
}
而我错误代码写成:
if((x1+x2)/2==1)
{
s[x1][y1]==0;
return 0;
}
写成这个样子的原因在于我写伪代码的时候自动把x1=1,x2=2,当成终止情况了,由此导致无限循环。