[ZOJ 2423] Fractal

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2423

 

題目大意:

 

給n畫叉

  • n=1
    X
    
  • n=2
    X X
     X
    X X
    
  • 用n-1的叉叉圖表示n的叉叉圖
    B(n - 1)          B(n - 1)
             B(n - 1)
    B(n - 1)          B(n - 1)

 

解題思路:

n最大隻到7,預處理一下所有n的字符串保存起來,然後根據輸入的n輸出字符串即可。

要注意的是行末不可以有多餘空格,否則會PE。可以處理完n=1..7所有字符串後再對每一行去末尾空格。

 

源代碼:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
    freopen("ans.txt", "w", stdout);
    string b[8][3000];
    string space[8];
    int line[8], n;
    b[1][0]="X";
    space[2]=" ";
    line[1]=1; line[2]=3;
    for (int i=3; i<=7; i++)
    {
        space[i]=space[i-1]+space[i-1]+space[i-1];
        line[i]=line[i-1]*3;
    }
    for (int i=2, lh=1; i<=7; i++, lh*=3)
    {
        for (int j=0, k=2*lh; j<lh; j++, k++)
        {
            b[i][j]=b[i-1][j]+space[i]+b[i-1][j];
            b[i][k]=b[i][j];
        }
        for (int j=lh; j<2*lh; j++)
            b[i][j]=space[i]+b[i-1][j-lh]+space[i];
    }
    for (int i=1; i<=7; i++)
        for (int j=0, k; j<line[i]; j++)
        {
            string tmp=b[i][j];
            for (k=tmp.length()-1; k>=0; k--)
                if (tmp[k]!=' ') break;
            b[i][j].assign(tmp, 0, k+1);
        }
    while (scanf("%d", &n)==1 && n!=-1)
    {
        for (int i=0; i<line[n]; i++)
            cout<<b[n][i]<<endl;   
        printf("-\n");
    }
    return 0;
}


 

解題心得:

PE了兩次,太不小心了。其實都應該打到記事本看一看的。。。

 

發佈了43 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章