Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
终于AC了!WA了两次,又是下标弄反了,给的厕试数据醛是X=Y的也检查不出来,还是靠静态debug#include <iostream> #include <stdio.h> using namespace std; char coal[1600][1600] = {{'\0'}}; struct node{ int X; int Y; int posX; int posY; node *left, *right; char tag; bool isLeaf(){ return tag >= 'A' && tag <= 'Z'; } }; bool isZiM(char c){ return c >= 'A' && c <= 'Z'; } bool isZiMAst(char c){ return isZiM(c) || c == '*'; } int parse(node *root, char *s, int idx){ //返回的是新的idx值 if(isZiM(s[idx])){ root->tag = s[idx]; root->left = NULL; root->right = NULL; return idx+1; } root->tag = s[idx]; node *temp = new node(); root->left = temp; int you = parse(root->left, s, idx+1); node *tp = new node(); root->right = tp; return parse(root->right, s, you); } void resize(node *root, int newX, int newY){ int oldX = root->X, oldY = root->Y; root->X = newX, root->Y = newY; if(root->isLeaf()){ return; } if(oldX == newX && root->tag == '|'){ resize(root->left, root->left->X, newY); resize(root->right, root->right->X, newY); } else if(oldY == newY && root->tag == '-'){ resize(root->left, newX, root->left->Y); resize(root->right, newX, root->right->Y); } else if(oldX == newX && root->tag == '-'){ int olt = root->left->Y, ort = root->right->Y; int nlt = (newY * olt - 1) / (olt + ort) + 1; int nrt = newY - nlt; resize(root->left, newX, nlt); resize(root->right, newX, nrt); } else if(oldY == newY && root->tag == '|'){ int olt = root->left->X, ort = root->right->X; int nlt = (newX * olt - 1) / (olt + ort) + 1; int nrt = newX - nlt; resize(root->left, nlt, newY); resize(root->right, nrt, newY); } return; } void getSize(node *root){ if(root->isLeaf()){ root->X = 2; root->Y = 2; return; } getSize(root->left); getSize(root->right); if(root->tag == '|'){ root->X = root->left->X + root->right->X; if(root->left->Y > root->right->Y){ root->Y = root->left->Y; resize(root->right, root->right->X, root->left->Y); } else if(root->left->Y < root->right->Y){ root->Y = root->right->Y; resize(root->left, root->left->X, root->right->Y); } else{ root->Y = root->left->Y; } } if(root->tag == '-'){ root->Y = root->left->Y + root->right->Y; if(root->left->X > root->right->X){ root->X = root->left->X; resize(root->right, root->left->X, root->right->Y); } else if(root->left->X < root->right->X){ root->X = root->right->X; resize(root->left, root->right->X, root->left->Y); } else{ root->X = root->left->X; } } } void getPos(node *root, int x, int y, char coal[1600][1600]){ root->posX = x; root->posY = y; if(root->isLeaf()) { coal[x][y] = root->tag; if(!isZiM(coal[x+root->X][y])) coal[x+root->X][y] = '*'; if(!isZiM(coal[x+root->X][y+root->Y])) coal[x+root->X][y+root->Y] = '*'; if(!isZiM(coal[x][y+root->Y])) coal[x][y+root->Y] = '*'; for(int i = 1; i < root->X; i++){ if(!isZiMAst(coal[x+i][y])) coal[x+i][y] = '-'; if(!isZiMAst(coal[x+i][y+root->Y])) coal[x+i][y+root->Y] = '-'; } for(int j = 1; j < root->Y; j++){ if(!isZiMAst(coal[x+root->X][y+j])) coal[x+root->X][y+j] = '|'; if(!isZiMAst(coal[x][y+j])) coal[x][y+j] = '|'; } return; } getPos(root->left, x, y, coal); if(root->tag == '|'){ getPos(root->right, x+root->left->X, y, coal); } else{ getPos(root->right, x, y+root->left->Y, coal); } } void printSize(node *root){ if(root->isLeaf()){ cout << root->tag << " " << root->X << " " << root->Y << endl; return; } } int main() { int cases; scanf("%d", &cases); for(int ii = 1; ii <= cases; ii++){ cout << ii << endl; char s[4096]; scanf("%s", s); node *root = new node(); parse(root, s, 0); getSize(root); for(int i = 0; i <= root->Y; i++){ for(int j = 0; j <= root->X; j++){ coal[j][i] = ' '; } } getPos(root, 0, 0, coal); for(int i = 0; i <= root->Y; i++){ for(int j = 0; j <= root->X; j++){ cout << coal[j][i]; } cout << endl; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator