⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2321.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 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 + -