原題鏈接:http://162.105.81.212/JudgeOnline/problem?id=1941
解題方法:剛開始拿到這道題,我的第一反應是要一行一行的輸出,不過做了幾分鐘之后發(fā)現(xiàn):在題述意思下行與行之間似乎沒有規(guī)律可言;
所以這種方法只能作罷;后來看了看discuss,有人提到用遞歸的方法來做這道題,這才恍然大悟:像種大問題嵌套類似之子問題的時候,遞歸不是最理想的方法么?
開一個很大的二維矩陣(因為不知道N的最大值有多大,矩陣盡量開大一點可以避免越界),然后給出中間某個點的坐標,讓它成為整個圖形的坐下點坐標,然后遞歸得“畫出”三個子圖形(當然還要注意一下遞歸出口O(∩_∩)O~),即可;當然在不知道這個題目n的最大值時,我們可以每次畫圖后刷新一邊矩陣,不過為了優(yōu)化速度,我只將n=10的圖形畫出,然后再由點與點之間的關系,求出各個參數(shù)的大小即可;
最后輸出,這個沒什么可說的了。。。
說句題外話,我交題的時候出現(xiàn)Access denied現(xiàn)
幸好過年的時候也遇到過同樣情況 用IP地址才可正常訪問 大家注意下:
遇到Access denied的用戶請通過http://162.105.81.212訪問poj
#include<iostream>
#include<cmath>
#include <cstdlib>
using namespace std;
#define MAX 100000000
#define MIN -100000000

char mymap[5000][5000];

int leftdot;
int rightdot;
int topdot;
int bottomdot;

void figure(int x,int y,int deep)


{

if(deep==1)

{

mymap[x][y]='/';
mymap[x][y+1]='_';
mymap[x][y+2]='_';
mymap[x][y+3]='\\';
mymap[x-1][y+1]='/';
mymap[x-1][y+2]='\\';
}
else

{
int dis=(int)pow((double)2,deep);
figure(x,y,deep-1);
figure(x,y+dis,deep-1);
figure(x-dis/2,y+dis/2,deep-1);
}
}


int main ()


{

int n;
int i,j;
leftdot=MAX;
rightdot=MIN;
topdot=MAX;
bottomdot=MIN;
memset(mymap,' ',sizeof(mymap));
figure(2500,2500,10);
while(scanf("%d",&n))

{

if(n==0)
break;

topdot=2500-(int)pow((double)2,10)+1;
bottomdot=topdot+(int)pow((double)2,n)-1;
leftdot=2500+(int)pow((double)2,10)-(int)pow((double)2,n);
rightdot=leftdot+(int)pow((double)2,n+1)-1;
for(i=topdot;i<=bottomdot;i++)

{

for(j=leftdot;j<=rightdot;j++)

{

printf("%c",mymap[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
system("pause");
}

