📄 2321.cpp
字号:
/* This Code is Submitted by wywcgs for Problem 2321 on 2006-08-13 at 19:41:03 */
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
const int L = 128;
const int FN = 512;
const int N = 1000;
struct cmp {
bool operator ()(const char* s1, const char* s2) const {
return strcmp(s1, s2) < 0;
}
};
map<char*, int, cmp> fl, lay;
char plane[N][N];
int ph, pw, bn, fn;
class File {
public:
char name[L], map[L][L];
int w, h;
void make(int);
void fill(int, int);
};
File f[L];
void File::make(int o) {
scanf("%s %d %d", name, &h, &w); fl[name] = o;
for(int i = 0; i < h; i++) scanf("%s", map[i]);
}
void File::fill(int x, int y) {
if(x >= N || x+w < 0 || y >= N || y+h < 0) return;
for(int i = max(0, -y); i < h; i++) {
if(i+y >= N) break;
for(int j = max(0, -x); j < w; j++)
if(j+x >= N) break;
else {
if(map[i][j] != '.') plane[i+y][j+x] = map[i][j];
pw >?= j+x+1;
}
ph >?= y+i+1;
}
}
class Block {
public:
char name[L], rel[L];
int x, y, layn, pfn, apn;
bool absol;
void scanData(char*, char*, int, char*, bool, char);
void make(int);
void act() { comCor(); f[pfn].fill(x, y); }
void comCor();
bool operator <(const Block& b) const { return layn < b.layn || (layn == b.layn && apn < b.apn); }
};
Block b[FN];
void Block::scanData(char* src, char* dis, int get, char* format, bool endc, char ec) {
switch(get) {
case 0: scanf(format, dis); break;
case 1: gets(dis); break;
default: sscanf(src, format, dis); break;
}
int len = strlen(dis);
if(dis[len-1] == ec) dis[len-1] = 0;
else if(endc) { scanf("\n"); getchar(); }
}
void Block::make(int o) {
apn = o;
char info[L], pfl[L];
scanData(NULL, name, 0, "\n#%s\n", true, '{');
scanf("\npos-x\n:%d\npx\n;\npos-y\n:%d\npx\n;", &x, &y);
scanf("\nposition\n:\n");
scanData(NULL, info, 1, NULL, true, ';');
absol = !strncmp(info, "absolute", 8);
if(!absol) scanData(info, rel, 2, "\nrelative\n=%s", false, ';');
scanData(NULL, pfl, 0, "\nfile\n:%s", true, ';');
pfn = fl.find(pfl)->second;
scanf("\nlayer\n:%d\n;\n}", &layn);
}
void Block::comCor() {
if(absol) return;
else {
int rn = lay.find(rel)->second;
b[rn].comCor();
x += b[rn].x; y += b[rn].y;
absol = true;
}
}
int main()
{
int t, T;
scanf("%d", &T);
for(t = 1; t <= T; t++) {
lay.clear(); fl.clear();
scanf("%d", &fn);
for(int i = 0; i < fn; i++) f[i].make(i);
scanf("%d", &bn);
for(int i = 0; i < bn; i++) b[i].make(i);
sort(b, b+bn);
for(int i = 0; i < bn; i++) lay[b[i].name] = i;
memset(plane, ' ', sizeof(plane)); pw = ph = 0;
for(int i = 0; i < bn; i++) b[i].act();
printf("Scenario #%d:\n", t);
for(int i = 0; i < ph; i++) {
for(int j = 0; j < pw; j++)
putchar(plane[i][j] == '.' ? ' ' : plane[i][j]);
putchar('\n');
}
putchar('\n');
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -