........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E.. DDDDDD.. ........ ..B..B.. .C.C.... E....E.. D....D.. ........ ..B..B.. .CCC.... E....E.. D....D.. ....AAAA ..B..B.. ........ E....E.. D....D.. ....A..A ..BBBB.. ........ E....E.. DDDDDD.. ....A..A ........ ........ E....E.. ........ ....AAAA ........ ........ EEEEEE.. ........ ........ ........ ........ 1 2 3 4 5
.CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..
9 8 .CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..Sample Output
EDABC题意:
给出叠加后的效果图,去判断是按照什么顺序叠加起来的,
规则如下:
(1) 图片宽度均为一个字符,四边均不短于三个字符;
(2) 每张图片四条边当中每条边都能看见一部分;
(3) 每张图片中字母代表对应的图片,任何两张图片中不会有相同的字母。
输出描述:
对输入文件中的每个测试数据,按照从底到顶的顺序(先输出底部被覆盖的图片)输出这些图片的叠加顺序(用图片中的字母代表图片)。如果有多组解,则按照字典序输出每一个解。
思路:
对于给出叠加后的图形,扫描一遍过后可以得到每一个字母的坐标,因为每一个字母矩形每条边上至少都会有一个点,那么就可以确定矩形的大小和四个关键坐标,根据这四个坐标就可以遍历这个字母矩形。在遍历一个字母矩形(A)的时候,若是这个矩形上出现了其他字母(B)就证明是别的字母覆盖了它本身,B在A上面。
这样把所有的矩形都弄完可以得到一些关系,这样就可以拓扑排序,但是题目要求多组的话字典序,又需要dfs一遍,这样就解决了。
CODE:
#include
#include
#include
#include
using namespace std;
#define N 31
#define INF 0x3f3f3f3f
int n,m,sum;
int alpha[N],indegree[N];//记录多少个字母,每个字母的入度
char seq[N],e[N][N];
vectorv[N];//建立邻接表
struct node //四个数值确定矩形的大小和位置
{
int xmax,xmin;
int ymax,ymin;
} a[N];
void build(int s)//建图
{
char c;
int i,j,k;
for(k=0; ka[c-'A'].xmax)
a[c-'A'].xmax=i;
if(ia[c-'A'].ymax)
a[c-'A'].ymax=j;
if(j