题目链接:http://poj.org/problem?id=2083
这题不能用G++提交...
见到两次知道有递归的写法,然而并不会,这次发现并不难;
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int len[8]= {0,1}, s[1000][1000]; void dfs(int n, int x, int y) { s[x][y]=1; if(n==7)return ; int m = len[n]; dfs(n+1, x, y);///左上 dfs(n+1, x, y+2*m);///左下 dfs(n+1, x+2*m, y);///右上 dfs(n+1, x+m, y+m);///中间 dfs(n+1, x+2*m, y+2*m);///右下 } int main() { memset(s, 0, sizeof(s)); for(int i=2; i<=7; i++) len[i]=3*len[i-1]; dfs(1, 1, 1); int n; while(scanf("%d", &n), n!=-1) { for(int i=1; i<=len[n]; i++) { for(int j=1; j<=len[n]; j++) { if(s[i][j]==1)printf("X"); else printf(" "); } printf("\n"); } printf("-\n"); } return 0; }
下面是我写的比较恶心的代码:
#include<stdio.h> #include<string.h> #define N 903 #define met(a, b) memset(a, b, sizeof(a)) struct node { int len; char s[N][N]; }a[8]; void P1(char s[][N], int X1, int X2, int Y1, int Y2, char s0[][N]) { for(int i=X1, p=0; i<=X2; i++, p++) { for(int j=Y1, q=0; j<=Y2; j++, q++) { s[i][j] = s0[p][q]; } } } void P2(char s[][N], int X1, int X2, int Y1, int Y2) { for(int i=X1; i<=X2; i++) { for(int j=Y1; j<=Y2; j++) { s[i][j] = ‘ ‘; } } } void Init() { met(a, 0); a[1].s[0][0] = ‘X‘; a[1].len = 1; for(int i=2; i<=7; i++) { int n = a[i-1].len; a[i].len = n*3; P1(a[i].s, 0, n-1, 0, n-1, a[i-1].s); P2(a[i].s, 0, n-1, n, 2*n-1); P1(a[i].s, 0, n-1, 2*n, 3*n-1, a[i-1].s); P2(a[i].s, n, 2*n-1, 0, n-1); P1(a[i].s, n, 2*n-1, n,2*n-1, a[i-1].s); P2(a[i].s, n, 2*n-1, 2*n, 3*n-1); P1(a[i].s, 2*n, 3*n-1, 0, n-1, a[i-1].s); P2(a[i].s, 2*n, 3*n-1, n, 2*n-1); P1(a[i].s, 2*n, 3*n-1, 2*n, 3*n-1, a[i-1].s); } } int main() { Init(); int n; while(scanf("%d", &n), n!=-1) { for(int i=0; i<a[n].len; i++) { for(int j=0; j<a[n].len; j++) printf("%c",a[n].s[i][j]); printf("\n"); } printf("-\n"); } return 0; }
原文:http://www.cnblogs.com/zhengguiping--9876/p/5025751.html