[传智杯]游园会盖章(模拟)

题目描述

传智专修学院举办了一场游园活动,其中一个非常重要的环节就是收集印章。集章卡是一张高度宽度分别为 h,w(20<=h<=1000,50<=w<= 2000)的白纸。初始情况下每个单位像素都是由 . 来填充(代表白色)。

现在小 A 在一个摊位上盖章。由于小 A 很喜欢这个摊位印章的样式,所以他会连续盖上 n(1<=n<=2000) 次印。这个印章是宽 50、高 20 的图形,是这样:

...........................,]]OOO@@@@OOO]`........
....................,]OO@@@@@@@@@@@@@@@@@@@@O`....
................./O@@@@@@@@@@@@@@@@@@@@@@@@@@@@^..
............../O@@@@@@@@@@@@@@@OOOOOOO@@@@@@@@@@@.
..........,@@@@@@@@@@O/[.............[O@@@@@@@\
........,O@@@@@@@@@@O/`..................,O@@@@@@O
.......O@@@@@@@@@O`......]OO@@@O\`........O@@@@@@@
.....,O@@@@@@@@/`.....]O@@@@@@@@@@^.......O@@@@@@@
...,@@@@@O/.....@@@@@@@@@@@@O......@@@@@0
..=@@@@@@@O`.....@@@@@@@@@@@@@@^.....O@@@@@@@O.
.@@@@@/......O@@@@@@@@@@@@@@@O`....@@@@@@O..
=@@@@@@@O......O@@@@@@@@@@@@@@@^....O@@@@@@@@@O...
O@@@@@@@^.....=@@@@@@@@@@@@@O[....@@@@@@@O`....
@@@@@@@O.......\@@@@@@@@O[...../O@@@@@@@@@O`......
@@@@@@@@^.........[`.......]OO@@@@@@@@@@O`........
O@@@@@@@@O\............]@@@@@@@@@@O/...........
=@@@@@@@OOOoo`........O@@@@@@@@@@@@/`.............
..\OOOOO*,`*..........O@@@@@@@@@O`................
.....,[[..............O@@@@@@O`...................
......................O@@@@@@O....................

由于盖章时手不太稳,所以盖章时也有可能会使这个图样旋转 180°(当然不同的字符只代表不同的颜色,字符本身不需要翻转)。

现在已经知道了小 A 的 n 次盖章信息,包括左上角坐标 x,y,和旋转方式 r。也就是说,这个图样旋转后的左上角,位于集章卡的第 x 行 y 列的位置,集章卡的左上角坐标是 (0,0)。

需要特别注意的是,后盖的印章可能和之前改的印章重叠。后盖的章有颜色的部分(不是 . 的部分)会覆盖之前印上的图形。

输入

第一行三个整数 n,h,w 代表印章次数,代表集章卡的高度和宽度。

接下来 n 行,每行三个整数 x,y,r,描述每次盖章的信息。其中 (x,y)是图样(旋转后)左上角的坐标,r(0<= r <=1) 代表旋转方式,代表图样顺时针旋转 r*180°,保证印章的图案至少有一部分在集章卡内部。

输出

输出一个高度为 h,宽度为 w 的字符矩阵,表示全部盖印后的集章卡的样子。评测时会忽略行末空格和输出文件末尾的回车。

样例输入

2 37 70
2 2 0
15 18 1

样例输出

......................................................................
......................................................................
.............................,]]OOO@@@@OOO]`..........................
......................,]OO@@@@@@@@@@@@@@@@@@@@O`......................
.................../O@@@@@@@@@@@@@@@@@@@@@@@@@@@@^....................
................/O@@@@@@@@@@@@@@@OOOOOOO@@@@@@@@@@@...................
............,/@@@@@@@@@@@@O/[.............[O@@@@@@@\..................
..........,O@@@@@@@@@@O/`..................,O@@@@@@O..................
.........O@@@@@@@@@O`......]OO@@@O\`........O@@@@@@@..................
.......,O@@@@@@@@/`.....]O@@@@@@@@@@^.......O@@@@@@@..................
.....,/@@@@@@@O/...../@@@@@@@@@@@@@@O....../@@@@@@@0..................
....=@@@@@@@O`...../@@@@@@@@@@@@@@@@^.....O@@@@@@@O...................
.../@@@@@@@/......O@@@@@@@@@@@@@@@O`..../@@@@@@@@O....................
..=@@@@@@@O......O@@@@@@@@@@@@@@@^....O@@@@@@@@@O.....................
..O@@@@@@@^.....=@@@@@@@@@@@@@O[..../@@@@@@@@@O`......................
..@@@@@@@O.......\@@@@@@@@O[...../O@@@O@@@@@@O........................
..@@@@@@@@^.........[`.......]OO@@@@@`O@@@@@@O..............[[,.......
..O@@@@@@@@O\............]/@@@@@@@`O@@@@@@@@@O..........*`,*OOOOO\....
..=@@@@@@@OOOoo`........O@@@@@@`/@@@@@@@@@@@@O........`ooOOO@@@@@@@=..
....\OOOOO*,`*..........O@@@@/O@@@@@@@@@@@@/]............\O@@@@@@@@O..
.......,[[..............O@`O@@@@@@@@@@OO].......`[.........^@@@@@@@@..
........................`O@@@@@@@@@O/.....[O@@@@@@@@\.......O@@@@@@@..
......................`O@@@@@@@@@/....[O@@@@@@@@@@@@@=.....^@@@@@@@O..
.....................O@@@@@@@@@O....^@@@@@@@@@@@@@@@O......O@@@@@@@=..
....................O@@@@@@@@/....`O@@@@@@@@@@@@@@@O....../@@@@@@@/...
...................O@@@@@@@O.....^@@@@@@@@@@@@@@@@/.....`O@@@@@@@=....
..................0@@@@@@@/......O@@@@@@@@@@@@@@/...../O@@@@@@@/,.....
..................@@@@@@@O.......^@@@@@@@@@@O].....`/@@@@@@@@O,.......
..................@@@@@@@O........`\O@@@OO]......`O@@@@@@@@@O.........
..................O@@@@@@O,..................`/O@@@@@@@@@@O,..........
..................\@@@@@@@O[.............[/O@@@@@@@@@@@@/,............
...................@@@@@@@@@@@OOOOOOO@@@@@@@@@@@@@@@O/................
....................^@@@@@@@@@@@@@@@@@@@@@@@@@@@@O/...................
......................`O@@@@@@@@@@@@@@@@@@@@OO],......................
..........................`]OOO@@@@OOO]],.............................
......................................................................
......................................................................

思路分析

一道字符串的模拟,没啥思维量,但是有一些需要注意的地方
1.就是怎么把这个印章存起来,在这卡了好一会,还要注意转义的\。
2.怎么排除在界外的情况:就是更新ans字符数组的时候要加一个判断,如果要赋的值在外边,就不赋。

AC代码

#include
using namespace std;

char s[20][51]={
     
"...........................,]]OOO@@@@OOO]`........",
"....................,]OO@@@@@@@@@@@@@@@@@@@@O`....",
"................./O@@@@@@@@@@@@@@@@@@@@@@@@@@@@^..",
"............../O@@@@@@@@@@@@@@@OOOOOOO@@@@@@@@@@@.",
"..........,/@@@@@@@@@@@@O/[.............[O@@@@@@@\\",
"........,O@@@@@@@@@@O/`..................,O@@@@@@O",
".......O@@@@@@@@@O`......]OO@@@O\\`........O@@@@@@@",
".....,O@@@@@@@@/`.....]O@@@@@@@@@@^.......O@@@@@@@",
"...,/@@@@@@@O/...../@@@@@@@@@@@@@@O....../@@@@@@@0",
"..=@@@@@@@O`...../@@@@@@@@@@@@@@@@^.....O@@@@@@@O.",
"./@@@@@@@/......O@@@@@@@@@@@@@@@O`..../@@@@@@@@O..",
"=@@@@@@@O......O@@@@@@@@@@@@@@@^....O@@@@@@@@@O...",
"O@@@@@@@^.....=@@@@@@@@@@@@@O[..../@@@@@@@@@O`....",
"@@@@@@@O.......\\@@@@@@@@O[...../O@@@@@@@@@O`......",
"@@@@@@@@^.........[`.......]OO@@@@@@@@@@O`........",
"O@@@@@@@@O\\............]/@@@@@@@@@@@@O/...........",
"=@@@@@@@OOOoo`........O@@@@@@@@@@@@/`.............",
"..\\OOOOO*,`*..........O@@@@@@@@@O`................",
".....,[[..............O@@@@@@O`...................",
"......................O@@@@@@O...................."
};
char t[20][50];
char ans[2010][4010];
int n,h,w;

int main(){
     
	for(int i=0;i<20;i++){
     
		for(int j=0;j<50;j++){
     
			t[i][j]=s[19-i][49-j];
		} 
	}

	scanf("%d %d %d",&n,&h,&w);
	for(int i=0;i<h;i++){
     
		for(int j=0;j<w;j++)
			ans[i][j]='.'; 
	}

	while(n--){
     
		int x,y,r;
		scanf("%d %d %d",&x,&y,&r);
		if(r%2==0){
     
			for(int i=0;i<=19;i++){
     
				for(int j=0;j<=49;j++){
     
					if(x+i>=0&&y+j>=0&&x+i<h&&y+j<w&&s[i][j]!='.')
						ans[x+i][y+j]=s[i][j];
				}
			}			
		}else{
     
			for(int i=0;i<=19;i++){
     
				for(int j=0;j<=49;j++){
     
					if(x+i>=0&&y+j>=0&&x+i<h&&y+j<w&&t[i][j]!='.')
						ans[x+i][y+j]=t[i][j];
				}
			}			
		}
	} 
	
	for(int i=0;i<h;i++){
     
		for(int j=0;j<w;j++){
     
			cout<<ans[i][j];
		}
		cout<<endl;
	}
	
	return 0;			
}

你可能感兴趣的:(模拟,算法,模拟,字符串)