题目链接:http://poj.org/problem?id=1270

这道题其实就是求所有满足条件的topo序,我们考虑到给定的字符是确定的,也就是他们的长度都是一样的,所以为了得到所有的情况,我们可以考虑深度优先搜素和dfs解答树上的回溯。首先,我们从任何一个入度为0的点开始dfs,将这个点的入度-1,防止下一层的搜索中搜到这个点,再更新所有这个点可到达的点的入度,完成这些状态更新之后dfs解答树进入下一层搜索,直到深度值等于串长,输出topo序。回溯的过程中我们需要将之前修改的所有的状态都修改回来。读入的时候要考虑到一次性读入一行,然后进行空格的处理。

代码如下:

 #include<cstdio>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
const int maxn=;
int n,m,t;
int vis[maxn],in[maxn],e[maxn][maxn];
char s[],h[maxn],ans[maxn];
int cnt;
void init()
{
memset(vis,,sizeof(vis));
memset(in,,sizeof(vis));
memset(ans,,sizeof(ans));
memset(e,,sizeof(e));
}
void toposort(int dep)
{
if(dep==cnt)
{
printf("%s\n",ans);
return ;
}
for(int i=;i<cnt;i++)
{
if(in[i]==&&!vis[i])//只要找到入度为0而且不在topo序中的点就开始搜索,至于回溯和标记则是在递归中进行
{
vis[i]=;
ans[dep]=h[i];
for(int j=;j<cnt;j++)
if(e[i][j])in[j]--;
toposort(dep+);
vis[i]=;
for(int j=;j<cnt;j++)
if(e[i][j])in[j]++;//回溯过程
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//std::ios::sync_with_stdio(false);
while(gets(s))//一次性读取一行字符串在处理
{
cnt=;
int len=strlen(s);
map<char ,int > mp;
init();
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')//读掉空格
{
h[cnt++]=s[i];
}
}
sort(h,h+cnt);//为了保证最终的topo序是按照字典序输出的,需要给字符集排个序,这样搜索将会变得有序
for(int i=;i<cnt;i++)
{
mp[h[i]]=i;//将字符集转化成整数集
}
gets(s);
len=strlen(s);
int tmp1,tmp2;
bool flag=;//由于是成对出现的,通过对flag的翻转可以确认目前得到的是成对的第一个数还是第二个数
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
if(!flag)
{
flag=;
tmp1=mp[s[i]];//得到的是成对中的第一个数,并获取编号
}
else
{
tmp2=mp[s[i]];
flag=;
e[tmp1][tmp2]=;
in[tmp2]+=;
}
}
}
toposort();
printf("\n");//注意每个结果之后有一个空行
}
}

最新文章

  1. SQLyog图形化l数据库的操作和学习
  2. 深入.NET平台的软件系统分成开发(1/6)
  3. 【BZOJ】3309: DZY Loves Math
  4. php 生成 Json
  5. x-forwarded-for的深度挖掘
  6. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
  7. WinDBG使用之线程
  8. [OFBiz]开发 一
  9. [CODEVS1014]装箱问题
  10. C# 向批处理文件输入字符
  11. 一个好用的hash函数(C语言)
  12. PHP进口Excel至MySQL方法
  13. perl版 Webshell存活检测
  14. java 需要准备的知识(转摘)
  15. 初识WCF之使用配置文件部署WCF应用程序
  16. ISLR系列:(4.3)模型选择 PCR &amp; PLS
  17. Java 基本文件操作
  18. Python学习的相关文件链接
  19. MATLAB——神经网络init初始化函数和adapt函数
  20. VPS常用操作(自用)

热门文章

  1. MySQL5.7主从复制slave报Last_Errno: 1146错误解决
  2. figure设置坐标轴
  3. Spark基础全解析
  4. python 读取 execl 文件 之 xlrd 模块
  5. APM监控工具Pinpoint搭建
  6. JS基础入门篇(三十五)—面向对象(二)
  7. js对象中关于this关键字的作用
  8. C# BASS音频库 + 频谱基本用法
  9. MySQL敏感数据加密及解密
  10. nes 红白机模拟器 第2篇 InfoNES