下面是poj2083 discuss里面的精简代码
#include"stdio.h" #include"math.h" main() { int i,j,n,ii,jj,k; while(scanf("%d",&n)&&n--!=-1) { for(i=0;i<pow(3,n);i++,printf("\n")) for(j=0;j<pow(3,n);j++) { for(ii=i,jj=j,k=0;k<n&&(ii%3+jj%3)%2==0;ii/=3,jj/=3,k++) ; printf("%c",32+56*(k==n)); } printf("-\n"); } }
递归代码就需要自己处理图中的数据关系,并且一步一步递归走下去,从大范围开始
注意 \0 和 \n 的区别
#include<stdio.h> #include<math.h> #include<string.h> char a[1000][1000]; void deal(int n,int size,int x,int y) { if(n==1){ a[x][y]='X'; return ; } size/=3; deal(n-1,size,x,y); deal(n-1,size,x+size,y+size); deal(n-1,size,x,y+2*size); deal(n-1,size,x+2*size,y); deal(n-1,size,x+2*size,y+2*size); } int main() { int n; while(scanf("%d",&n),n!=-1){ int power=pow((double)3,(double)(n-1)); for(int i=0;i<=power;i++){ for(int j=0;j<=power;j++) a[i][j]=' '; a[i][power+1]='\0'; } deal(n,power,1,1); for(int i=1;i<=power;i++) printf("%s\n",a[i]+1); puts("-"); } return 0; }
#include<stdio.h> #include<string.h> #include<math.h> char ans[3005][3005]; char a[10][10]; char tag; int n,temp; void deal(int ps,int size,int x,int y) { if(ps==1){ for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans[x+i][y+j]=a[i][j]; return ; } size/=n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(a[i][j]!=' ') deal(ps-1,size,i*size+x,j*size+y); } int main() { while(scanf("%d",&n),n) { getchar();//************重要 char t[10]; for(int i=0;i<n;i++){ //-------------不可以用printf输入有空格的字符串-----------// gets(t); for(int j=0;j<n;j++) a[i][j]=t[j]; } scanf("%d",&temp); memset(ans,' ',sizeof(ans));//*************重要 int power=pow((double)(n),(double)(temp)); //----------------基本上初始化所有数据-------------------// deal(temp,power,0,0); for(int i=0;i<power;i++) ans[i][power]='\0'; for(int i=0;i<power;i++) puts(ans[i]); } return 0; }