设为首页 加入收藏

TOP

欧拉回路解题实例分析(二)
2013-09-26 20:01:52 来源: 作者: 【 】 浏览:369
Tags:回路 解题 实例分析


    for(int i=0;i<=n;i++)
    {
    int tt=(i《1)-((i&(1《(lan-2)))《1);//在后面添0并去掉最高位
    //printf("i:%d  %d\n",i,tt);
    temp.v=tt;
    temp.via=0;
    temp.vis=false;
    myv[i].push_back(temp);
    tt+=1; //在后面添1并去掉最高位
    temp.v=tt;
    temp.via=1;
    myv[i].push_back(temp);
    }
    cnt=-1;
    dfs(n);
    path[++cnt]='\0';
    std:reverse(path,path+cnt);//倒过来
    //printf("%s\n",path);
    int ans=0;
    for(int i=k,j=1;j<=lan;j++,i++) //输出旋转k个位置后表示的数,注意是n位
    ans=(ans《1)+path[i%cnt]-'0';
    printf("%d\n",ans);
    }
    return 0;
    }
    </SPAN>
    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<stack>
    #include<list>
    #include<queue>
    #define eps 1e-6
    #define INF (1《30)
    #define PI acos(-1.0)
    using namespace std;
    struct Inf  //表示一条边,序号表示边起始点,v表示终点,via表示连0还是1,vis表示该边是否访问
    {
    int v,via;
    bool vis;
    };
    vector<Inf>myv[17000]; //2^14=16384
    char path[33000]; //共可以表示2^n个数,2^15=32768
    int n,cnt;
    void init() //初始化向量容器
    {
    for(int i=0;i<=n;i++)
    myv[i].clear();
    return ;
    }
    void dfs(int cur)
    {
    for(int i=0;i<myv[cur].size();i++)
    {
    if(myv[cur][i].vis==false)
    {
    myv[cur][i].vis=true;
    dfs(myv[cur][i].v);
    path[++cnt]=myv[cur][i].via+'0';//保存边,最先进来的是最后的边,用栈保存
    }
    }
    return ;
    }
    int main()
    {
    int k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
    if(n+k==0)
    break;
    int lan=n;
    n=(1《(n-1))-1; //最大的节点标号
    init();
    struct Inf temp;
    for(int i=0;i<=n;i++)
    {
    int tt=(i《1)-((i&(1《(lan-2)))《1);//在后面添0并去掉最高位
    //printf("i:%d  %d\n",i,tt);
    temp.v=tt;
    temp.via=0;
    temp.vis=false;
    myv[i].push_back(temp);
    tt+=1; //在后面添1并去掉最高位
    temp.v=tt;
    temp.via=1;
    myv[i].push_back(temp);
    }
    cnt=-1;
    dfs(n);
    path[++cnt]='\0';
    std:reverse(path,path+cnt);//倒过来
    //printf("%s\n",path);
    int ans=0;
    for(int i=k,j=1;j<=lan;j++,i++) //输出旋转k个位置后表示的数,注意是n位
    ans=(ans《1)+path[i%cnt]-'0';
    printf("%d\n",ans);
    }
    return 0;
    }

      

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇使用C++和XML建立智能文档(一) 下一篇C++一维数组和指针的关系总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: