POJ 1270 Following Orders
给出一些字母 表示会出现的字母 下面一行给出字母之间的关系 两个为一组 前面的一个表示比后面的大
根据给出的关系 输出所有可能存在的组合 组合 要按字典序输出
因为要输出所有的情况 所以要有回溯 dfs递归调用的过程 所以递归调用之后 要将状态恢复
建图真的很重要!!!
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
int rd[30],map[30][30];
bool vis[30];
char vex[30];
char ch[220];
int len;
int top;
int sum;
char sta[30];
void topsort(int sum)
{
if(sum==300) return;
if(top==len-1)
{
for(int i=0;i<len;i++)
printf("%c",sta[i]);
printf("\n");
sum++;
return;
}
for(int i=0;i<len;i++)
{
if(rd[i]==0&&!vis[i])
{
sta[++top]=vex[i];
vis[i]=1;
for(int j=0;j<len;j++)
{
if(map[i][j])
rd[j]--;
}
topsort(sum);
vis[i]=0;
for(int j=0;j<len;j++)
if(map[i][j]) rd[j]++;
top--;
}
}
}
int main()
{
//freopen("ceshi.txt","r",stdin);
while(gets(ch))
{
MEM(vis,0);
MEM(rd,0);
MEM(map,0);
int num=0;
int n=0;
char c[30];
while(ch[num]!='\0')
{
if(ch[num]!=' ')
c[n++]=ch[num++];
else num++;
}
len=n;
sort(c,c+n);//字典序
for(int i=0;i<n;i++)
vex[i]=c[i];
gets(ch);
num=0;
n=0;
while(ch[num]!='\0')
{
if(ch[num]!=' ') c[n++]=ch[num++];
else num++;
}
char a,b;
for(int i=0;i<n;i++)
{
a=c[i++];
b=c[i];
int x,y;
for(x=0;x<len;x++) if(vex[x]==a) break;
for(y=0;y<len;y++) if(vex[y]==b)
{
rd[y]++;
break;
}
map[x][y]=1;//按字典序保存
}
sum=0;
top=-1;
topsort(sum);
puts("");
}
return 0;
}