洛谷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,当成终止情况了,由此导致无限循环。