【uva-124】Following Orders (拓扑排序)竟然自己写出了全排列的算法!

来源:互联网 发布:衣服数据参考 编辑:程序博客网 时间:2024/05/16 18:33

题目大意:
第一行所有字母。
第二行两个两个字母是有偏序关系的。
最后输出要是所有符合偏序关系的按字母列表顺序输出。

思路:
存好偏序关系。
从小到大存好字母元素。
先找出所有可以放在首字母的字母(没有必须放在自身之前关系的),要注意i=j分开考虑。
用dfs寻找下一个可以排的字母。
还要注意dfs完成退后一步时要把标记找到的改成false。
基本思路没有问题但是数据处理要很细心。
调试了很久。


我还是……
唉一点也不成熟。
就是个巨婴呢。
这里写图片描述


/*    uva 124 by zhuhua    Time limit: 3000 ms    AC Time: 0 ms???*/#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>using namespace std;bool order[30][30];int exist[30];int siz;int head[30];int headsiz;int output[30];bool used[30];void dfs(int now,int n,int tot){    used[now]=true;    if(n==tot)    {        for(int i=0;i<siz;i++)            printf("%c",'a'+output[i]);        cout<<endl;        return;    }    else    {        for(int i=0;i<siz;i++)        {            bool cando=true;            if(!used[exist[i]])            {                    for(int j=0;j<n;j++)                    {                        if(exist[i]!=output[j]&&order[exist[i]][output[j]])                        {cando=false;break;}                    }                    if(cando)                    {                        output[n]=exist[i];                        dfs(exist[i],n+1,tot);                        used[exist[i]]=false;                    }            }        }    }}int main(){    string input,ord;    int cas=0;    while(getline(cin,input))    {        if(cas++)cout<<endl;        siz=0;        for(int i=0;i<input.length();i++)        {            if(input[i]!=' ')                exist[siz++]=input[i]-'a';        }        sort(exist,exist+siz);        memset(order,false,sizeof(order));        getline(cin,ord);        for(int i=0;i<ord.length();i=i+4)        {            int x=ord[i]-'a';            int y=ord[i+2]-'a';            order[x][y]=true;        }        bool flag;        headsiz=0;        for(int i=0;i<siz;i++)        {            flag=true;            for(int j=0;j<siz;j++)            {                if(i==j)continue;                if(order[exist[j]][exist[i]])                {                    flag=false;                    break;                }            }            if(flag)            {                    head[headsiz++]=exist[i];            }        }        for(int i=0;i<headsiz;i++)        {            output[0]=head[i];            dfs(head[i],1,siz);            used[head[i]]=false;        }    }    return 0;}
阅读全文
0 0
原创粉丝点击