首页 > 代码库 > POJ 2494 Acid Text 模拟

POJ 2494 Acid Text 模拟

题目大意:给定CSS语言的图片合成器,要求编译运行并输出结果

首先过样例 这个应该问题不大 然后交上去WA 那么请注意以下问题

1.读入用char 然后构造成string
2.由于White Space的肆虐横行,我们可以写一个Kill_Char(int x)函数,该函数的作用是干掉x个‘ ‘‘\t‘‘\n‘‘\r‘以外的字符,可以方便快捷地把题目中的无用信息清理掉
3.位置坐标的x和y是反的 过样例的应该都注意到了
4.鉴于分号可能和字符串连续或不连续出现,所以我们可以写一个函数Kill_Colon(),该函数的作用是判断读入区结尾是不是分号,如果是删除,如果不是Kill_Char(1)
5.点是透明不是空格
6.鉴于数字可能和分号一并出现,我们可以按照读字符串的方式读入数字并处理分号,然后用sscanf函数读入数字
7.stable_sort还用我说么
8.结尾空行要输出
9.确认Initialize函数拥有所需要的全部功能
10.预先将底板清成空格 输出时在结尾赋值‘\0‘
11.最重要的一点 ‘{‘前面可能没有空格 需要在读入时进行特判 这个卡了很久


然后尼玛才过去……这模拟题真是写吐了

#include<map>
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1010
using namespace std;
struct point{
	int x,y;
	point(){}
	point(int _,int __):x(_),y(__){}
	point operator + (const point z) const
	{
		point re;
		re.x=x+z.x;
		re.y=y+z.y;
		return re;
	}
	void Read()
	{
		scanf("%d%d",&x,&y);
	}
};
struct picture{
	point size;
	char image[110][110];
}pictures[110];
struct entry{
	point pos;
	int file;
	int layer;
	bool operator < (const entry &x) const
	{
		return layer < x.layer;
	}
}entries[510];
int max_x,max_y;
int n,m,cnt;
char ans[M][M];
char s[M];
string st;
map<string,int>picture_file,entry_file;
void Initialize()
{
	printf("Scenario #%d:\n",++cnt);
	max_x=max_y=0;
	memset(ans,' ',sizeof ans);
	picture_file.clear();
	entry_file.clear();
}
void Draw(const entry &e)
{
	int i,j;
	const picture &p=pictures[e.file];
	max_x=max(max_x,e.pos.x+p.size.x-1);
	max_y=max(max_y,e.pos.y+p.size.y-1);
	for(i=0;i<p.size.x;i++)
		for(j=0;j<p.size.y;j++)
			if(p.image[i][j]!='.')
				ans[e.pos.x+i][e.pos.y+j]=p.image[i][j];
}
void Output()
{
	int i,j;
	for(i=0;i<=max_x;i++)
	{
		ans[i][max_y+1]=0;
		puts(ans[i]);
	}
	puts("");
}
inline void Kill_Char(int x)
{
	char c;
	for(;x;x--)
		do c=getchar(); while(c==' '||c=='\t'||c=='\n'||c=='\r');
}
char Get_Char()
{
	char c;
	do c=getchar(); while(c==' '||c=='\t'||c=='\n'||c=='\r');
	return c;
}
inline void Kill_Colon()
{
	int k=strlen(s+1);
	if(s[k]==';')
		s[k]=0;
	else
		Kill_Char(1);
}
int main()
{
	
	//freopen("1.txt","w",stdout);
	
	int T,i,j,k;
	point temp;
	char c;
	for(cin>>T;T;T--)
	{
		Initialize();
		cin>>n;
		for(i=1;i<=n;i++)
		{
			cin>>st;
			picture_file[st]=i;
			pictures[i].size.Read();
			getchar();
			for(j=0;j<pictures[i].size.x;j++)
				scanf("%s",pictures[i].image[j]);
		}
		cin>>m;
		for(i=1;i<=m;i++)
		{
			Kill_Char(1);
			st.clear();
			while(c=Get_Char(),c!='{')
				st+=c;
			entry_file[st]=i;
			Kill_Char(6);
			scanf("%d",&temp.y);
			Kill_Char(9);
			scanf("%d",&temp.x);
			Kill_Char(12);
			entries[i].pos=point(-1,-1);
			s[0]=Get_Char();
			if(s[0]=='a')
				entries[i].pos=temp,Kill_Char(8);
			else
			{
				Kill_Char(8);
				scanf("%s",s+1);
				Kill_Colon();
				int fa=entry_file[string(s+1)];
				entries[i].pos=entries[fa].pos+temp;
			}
			Kill_Char(5);
			scanf("%s",s+1);
			Kill_Colon();
			entries[i].file=picture_file[string(s+1)];
			Kill_Char(6);
			scanf("%s",s+1);
			Kill_Colon();
			sscanf(s+1,"%d",&entries[i].layer);
			Kill_Char(1);
		}
		stable_sort(entries+1,entries+m+1);
		for(i=1;i<=m;i++)
			Draw(entries[i]);
		Output();
	}
}


POJ 2494 Acid Text 模拟