链接:https://vjudge.net/problem/POJ-1128

题意:

每张图片上面画了一些边框,给出这些边框叠在一起后的图片,图片边框一定是由一个字母表示并且每条边至少三个字符,输入保证至少会给出边框每条边的一个字母,一个角的一个字符表示两条边,图片边框用大写字母表示,并且不会有两张图片的边框使用同一个大写字母,求从下往上的重叠顺序,如果有多种结果的话就按照字典序输出所有结果

思路:

先建图,找每个图内部的图片个数,同时记录。

因为不用种类的都要输出,按照从小到大的字典序去DFS。

代码:

#include <iostream>
#include <memory.h>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <queue>
#include <string>
#include <stack>
#include <iterator>
#include <stdlib.h>
#include <time.h>
#include <assert.h> using namespace std;
typedef long long LL;
const int MAXN = 30 + 10;
char G[MAXN][MAXN];
char res[MAXN];
int M[MAXN][MAXN];
int Vis[MAXN];
int in[MAXN];
int n, m, cnt; void Init()
{
cnt = 0;
memset(Vis, 0, sizeof(Vis));
memset(in, 0, sizeof(in));
memset(M, 0, sizeof(M));
} void DFS(int num)
{
if (num == cnt)
{
res[num] = '\0';
cout << res << endl;
return;
}
for (int i = 0;i < 26;i++)
{
if (in[i] == 0 && Vis[i])
{
res[num] = 'A'+i;
in[i] = -1;
for (int j = 0;j < 26;j++)
if (M[i][j])
--in[j];
DFS(num+1);
in[i] = 0;
for (int j = 0;j < 26;j++)
if (M[i][j])
++in[j];
}
}
return;
} int main()
{
while (cin >> n >> m)
{
Init();
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
cin >> G[i][j];
for (int k = 0;k < 26;k++)
{
int x1 = MAXN, y1 = MAXN, x2 = -1, y2 = -1;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
{
if (G[i][j] == 'A'+k)
{
x1 = min(x1, i);
y1 = min(y1, j);
x2 = max(x2, i);
y2 = max(y2, j);
}
}
if (x1 == MAXN || y1 == MAXN || x2 == -1 || y2 == -1)
continue;
Vis[k] = 1;
cnt++;
for (int i = x1;i <= x2;i++)
{
for (int j = y1;j <= y2;j++)
{
if (i == x1 || i == x2 || j == y1 || j == y2)
{
if (G[i][j] != 'A'+k && G[i][j] != '.')
{
int t = G[i][j]-'A';
if (!M[k][t])
++in[t], M[k][t] = 1;
}
}
}
}
}
DFS(0);
} return 0;
}

  

POJ-1128-Frame Stacking的更多相关文章

  1. POJ 1128 Frame Stacking(拓扑排序&#183;打印字典序)

    题意  给你一些矩形框堆叠后的鸟瞰图  推断这些矩形框的堆叠顺序  每一个矩形框满足每边都至少有一个点可见  输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像  仅仅是这个要打印全部的可行 ...

  2. POJ 1128 Frame Stacking (拓扑排序)

    题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...

  3. POJ 1128 Frame Stacking 拓扑排序+暴搜

    这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...

  4. Frame Stacking ZOJ 1083,poj 1128

    Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4034   Accepted: 1352 De ...

  5. Frame Stacking(拓扑排序)

    题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076.   Frame Stacking Time Limit: 1.0 Seconds   Memory ...

  6. POJ 1988 Cube Stacking(并查集+路径压缩)

    题目链接:id=1988">POJ 1988 Cube Stacking 并查集的题目 [题目大意] 有n个元素,開始每一个元素自己 一栈.有两种操作,将含有元素x的栈放在含有y的栈的 ...

  7. POJ 1988 Cube Stacking( 带权并查集 )*

    POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...

  8. Frame Stacking 框架堆叠

    /* [题目来源]http://poj.org/problem?id=1128 [题目分析] 几张图片叠在一起,给出堆叠后的情况,要求出所有可能的从下到上的堆叠顺序. [思路分析] 1.题目已经很明确 ...

  9. poj.1988.Cube Stacking(并查集)

    Cube Stacking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submi ...

  10. POJ 1988 Cube Stacking(带权并查集)

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 23678   Accepted: 8299 Ca ...

随机推荐

  1. 基于:Hadoop 2.6.0-cdh5.4.0 hive1.1.0 HBase 1.0.0-cdh5.4.0 关键配置文件

    core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value ...

  2. 我积累的Java实用代码

    1.解压zip文件 /** * 解压输入的zip流,Java默认的解压只能处理UTF-8编码的文件或者目录名,否则会报MALFORMED异常 * * @param is 输入流 * @param ou ...

  3. python笔记--4--面向对象

    面向对象 Python中对象的概念很广泛,Python中的一切内容都可以称为对象,除了数字.字符串.列表.元组.字典.集合.range对象.zip对象等等,函数也是对象,类也是对象. 在Python中 ...

  4. [cerc2017J]Justified Jungle

    题目大意:删去k条边,树变为相等个点的连通分量,求所有正整数k. 解题关键:树dp,不必求因子. #include<bits/stdc++.h> using namespace std; ...

  5. PHP trim() 函数

    定义和用法 trim() 函数从字符串的两端删除空白字符和其他预定义字符. 语法 trim(string,charlist) 参数 描述 string 必需.规定要检查的字符串. charlist 可 ...

  6. koa的教程

    https://github.com/bmcmahen/koa-mongo-sessionhttp://www.fkwebs.com/2333.htmlhttps://segmentfault.com ...

  7. MarkdownPad 2 安装和破解

    MarkdownPad 2 安装和破解 下载:http://markdownpad.com/ 下载下面这个: 破解:http://w3cboy.com/post/2014/10/MarkdownPad ...

  8. Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

    查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup ...

  9. 数组队列C++实现

    template <typename _T>class CArrayQueue {public:    CArrayQueue() {        m_rear = 0;        ...

  10. 小小c#算法题 - 7 - 堆排序 (Heap Sort)

    在讨论堆排序之前,我们先来讨论一下另外一种排序算法——插入排序.插入排序的逻辑相当简单,先遍历一遍数组找到最小值,然后将这个最小值跟第一个元素交换.然后遍历第一个元素之后的n-1个元素,得到这n-1个 ...