p2083.cpp

来自「大概POJ上50道比较难的题的代码」· C++ 代码 · 共 45 行

CPP
45
字号
#include <iostream>
using namespace std;
string f[8][2187];
int po[8];
int main(){
    po[0] = 1;
    for(int i = 1;i < 8;++i){
        po[i] = po[i-1] * 3;
        for(int j = 0;j < po[i];++j)
            f[i][j].resize(po[i],' ');
    }
    f[0][0] = "X";
    for(int i = 1;i < 8;++i){
        for(int j = 0;j < po[i];++j){
            if(j < po[i-1]){
                for(int k = 0;k < po[i-1] && k < f[i-1][j].size();++k)
                    f[i][j][k] = f[i-1][j][k];
                for(int k = 2*po[i-1];k < 3*po[i-1] && k-2*po[i-1] < f[i-1][j].size();++k)
                    f[i][j][k] = f[i-1][j][k-2*po[i-1]];
            }
            if(j >= po[i-1] && j < 2*po[i-1])
                for(int k = po[i-1];k < 2*po[i-1] && k-po[i-1] < f[i-1][j-po[i-1]].size();++k)
                    f[i][j][k] = f[i-1][j-po[i-1]][k-po[i-1]];
            if(j >= 2*po[i-1]){
                for(int k = 0;k < po[i-1] && k < f[i-1][j-2*po[i-1]].size();++k)
                    f[i][j][k] = f[i-1][j-2*po[i-1]][k];
                for(int k = 2*po[i-1];k < 3*po[i-1] && k-2*po[i-1] < f[i-1][j-2*po[i-1]].size();++k)
                    f[i][j][k] = f[i-1][j-2*po[i-1]][k-2*po[i-1]];
            }
            int k;
            for(k = f[i][j].size()-1;k >= 0 && f[i][j][k] == ' ';--k);
            f[i][j].erase(k+1,f[i][j].size()-k);
        }
    }
    int n;

    scanf("%d",&n);
    while(n != -1){
        for(int i = 0;i < po[n-1];++i)
            printf("%s\n",f[n-1][i].c_str());
        puts("-");
        scanf("%d",&n);
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?