POJ 1128 拓扑排序 + 深搜
/* (⊙v⊙)嗯 貌似是一个建图 拓扑+深搜的过程。至于为什么要深搜嘛。。一个月前敲得题现在全部推了重敲,于是明白了。因为题意要求如果有多个可能的解的话。
* 就要输出字典序最小的那个。所以可以对26个英文字母从小到大尝试能否排出结果。于是出现了 深搜回溯。先选定入度为0的边框。标记为已用。将所有与它连通的
* 边框入度减一。然后递归搜索下一个。此时开始回溯。当前边框标记为未用,所有与它连通的边框入度加1.
* 建图的过程则是。对每一个字母的边框测量出来。然后对A里的其它字母B。(B 覆盖 A)。有关系 map[A][B] = *1。in[B]++;
*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 27
int map[maxn+5][maxn+5]; //建的图
char m[35][35]; //输入
int h, w; // 输入size
int tot; //有多少种字母边框
int in[maxn]; //每种字母对应的入度。
char ans[maxn]; // 存储答案
bool flag;
struct Node // 存储每个字母对应的边框边界
{
int lo, hi;
int le, ri;
}node[maxn+5];
void buildmap()
{
for (int i=0; i<h; ++i) // 测量边界
{
for (int j=0; j<w; ++j)
{
if (m[i][j] == '.')
continue;
int temp = m[i][j] - 'A';
if (in[temp] == -1)
{
in[temp] = 0;
tot++;
}
if (i > node[temp].hi) node[temp].hi = i;
if (i < node[temp].lo) node[temp].lo = i;
if (j < node[temp].le) node[temp].le = j;
if (j > node[temp].ri) node[temp].ri = j;
}
}
for (int k=0; k<maxn; ++k) //建图
{
if (in[k] == -1)
continue;
for (int i=node[k].lo; i<=node[k].hi; ++i)
{
for (int j=node[k].le; j<=node[k].ri; ++j)
{
if (i>node[k].lo && i<node[k].hi && j>node[k].le && j<node[k].ri)
continue;
int temp = m[i][j] - 'A';
if (k != temp && !map[k][temp])
{
map[k][temp] = 1;
in[temp] += 1;
}
}
}
}
}
int hh = 0;
void dfs(int num)
{
if (num == tot)
{
ans[num] = '\0';
cout << ans << endl;
return;
}
//觉得应该会有字典序不同的答案。所以在输出加上判断。然而。wa了。应该是递归没有理解清楚。
// if (num == tot && flag)
// {
// ans[num] = '\0';
// puts(ans);
// flag = false;
// return;
// }
for (int i=0; i<maxn; ++i)
{
if (in[i] == 0)
{
ans[num] = i + 'A';
in[i] = -1;
for (int j=0; j<maxn; j++)
{
if (map[i][j])
in[j] -= 1;
}
dfs(num+1);
in[i] = 0;
for (int j=0; j<maxn; ++j)
{
if (map[i][j])
in[j] += 1;
}
}
}
return;
}
int main()
{
while (scanf("%d%d", &h, &w) == 2)
{
tot = 0;
memset(in, -1, sizeof(in));
memset(map, 0, sizeof(map));
flag = true;
for (int i=0; i<maxn+5; ++i)
{
node[i].lo = 100;
node[i].le = 100;
node[i].hi = -1;
node[i].ri = -1;
}
for (int i=0; i<h; ++i)
{
scanf("%s", m[i]);
}
buildmap();
dfs(0);
}
return 0;
}
POJ 1128 拓扑排序 + 深搜的更多相关文章
- poj 3687(拓扑排序)
http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...
- POJ 3249 拓扑排序+DP
貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...
- poj 3249 拓扑排序 and 动态规划
思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解. #include<iostream> #include& ...
- poj 2585 拓扑排序
这题主要在于建图.对9个2*2的小块,第i块如果出现了不等于i的数字,那么一定是在i之后被brought的.可以从i到该数字建一条边. 图建好后,进行一次拓扑排序,判段是否存在环.若存在环,那么就是B ...
- Sorting It All Out POJ - 1094 拓扑排序
题意:给N个字母,和M个偏序关系 求一个可确定的全序,可确定是指没有其他的可能例如A>B D>B 那么有ADB DAB两种,这就是不可确定的其中,M个偏序关系可以看做是一个一个按时间给出的 ...
- poj 3984 -- 迷宫问题 深搜
迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, ...
- nyoj 349 (poj 1094) (拓扑排序)
Sorting It All Out 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 An ascending sorted sequence of distinct ...
- POJ 1128 Frame Stacking 拓扑排序+暴搜
这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...
- Poj(3687),拓扑排序,
题目链接:http://poj.org/problem?id=3687 题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号 ...
随机推荐
- 20145301 赵嘉鑫 《网络对抗》Exp5 MSF基础应用
20145301 赵嘉鑫 <网络对抗>Exp5 MSF基础应用 一 实验链接 渗透实验一:MS08_067渗透实验 渗透实验二:MS14_064渗透实验 (首用) 渗透实验三:Adobe ...
- 20145335郝昊《网络攻防》Exp4 Adobe阅读器漏洞攻击
20145335郝昊<网络攻防>Exp4 Adobe阅读器漏洞攻击 实验内容 初步掌握平台matesploit的使用 有了初步完成渗透操作的思路 本次攻击对象为:windows xp sp ...
- node包管理工具--nvm(windows)
windows 安装nvw-windows 使用nvm工具: windows使用nvm-noinstall.zip安装 nvm-noinstall.zip 这个是绿色免安装版本,但是使用之前需要配置 ...
- 求LCA练习+部分算法复习 2017.1.22
第一题就LCA即可.不过推荐用Tarjan(最快,常数很小).然后Tarjan的时候顺便就出一个dist[i],表示i节点到根节点的距离.求出了LCA,那么两点间的距离就为dist[u] + dist ...
- Python3基础 os mkdirs 创建多层文件夹
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- BZOJ3296: [USACO2011 Open] Learning Languages 并查集
Description 农夫约翰的N(2 <= N<=10,000)头奶牛,编号为1.. N,一共会流利地使用M(1<= M <=30,000)种语言,编号从1 .. M., ...
- 论文笔记——ThiNet: A Filter Level Pruning Method for Deep Neural Network Compreesion
论文地址:https://arxiv.org/abs/1707.06342 主要思想 选择一个channel的子集,然后让通过样本以后得到的误差最小(最小二乘),将裁剪问题转换成了优化问题. 这篇论文 ...
- 如何加速tomcat启动速度
在tomcat启动的时候,我们可以做一些优化设置来使得tomcat的启动更快速,下面是一些常见的优化加速启动的方法建议(以tomcat-7.+为例说明). 1. Jars包 1.1.将一些不必要的j ...
- Qt_DLL_4_MFC
1.下载地址: https://github.com/qtproject/qt-solutions 2. ZC: 做用于MFC的DLL的时候,app的创建 只能是在 主线程中,不然的话 就会报错... ...
- MS SQL动态创建临时表
开发业务需求,需要对一个表作数据分析,由于数据量较大,而且分析时字段会随条件相应变化而变化. 因此计划先把数据转插入一个临时表,再对临时表的数据进行分析. 问题点是如何动态创建临时表.原先Insus. ...