| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2124 人关注过本帖, 1 人收藏
标题:【求助】容斥原理与鸽巢原理
只看楼主 加入收藏
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:15 
用了一个 笨方法,即全排列,每次当该元素的前趋记录里面没有当前前趋时,就可输出。抛砖引玉吧,盼望好的程序出现:


程序代码:
#include<stdio.h>
#define N 8
#define WAP(a,b) {tmp=a;a=b;b=tmp;}
struct str
{
    int a;
    int b[N];
}str[N],tmp;
void my_sort(int);
void print();
int check( );
int num;
int main(void)
{
    int a[N];
    int i,j;
    for (i = 0; i < N; ++i)
    {
        str[i].a = i + 1;
    }
    my_sort(0);
    printf("num=%d\n",num);
    return 0;
}
void my_sort( int k)
{
    int i;
    if (k + 1 == N&&check())
    {
        print();
        ++num;
    }
    else
    {
        for (i = k ; i < N; ++i)
        {
            WAP(str[i], str[k]);
            my_sort(k + 1);
            WAP(str[i], str[k]);
        }
    }
}
int check()
{
    int i,j;
   
    for(i=1;i<N;++i)
    {
        for(j=0;j<N;++j)
        {
            if(str[i-1].a==str[i].b[j]) // 检查前趋记录里是否有当前前趋
            {
                return 0;
            }
        }
    }
    return 1;
}
void print()
{
    int i;
    int j;
    for (i = 0; i < N; ++i)
    {
        printf("%2d", str[i].a);
        if(i)
        {
            for(j=0;j<N;++j)
            {
                if(str[i].b[j]==0)
                {
                    str[i].b[j]=str[i-1].a;  // 记录前趋
                    break;
                }
            }
        }   
    }
    puts("");
}

2009-12-25 12:49
xuyin2009
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-11-1
收藏
得分:0 
不懂
2009-12-26 23:17
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
以下是引用m456m654在2009-12-24 13:53:20的发言:

使得没有孩子的前面是第一天在他前面的那个孩子。
我也没理解这句话是什么意思。
断句即可
好像在哪看过这个问题...

我可好玩啦...不信你玩玩^_^
2009-12-28 15:01
fqtb16
Rank: 7Rank: 7Rank: 7
来 自:上海
等 级:黑侠
帖 子:96
专家分:504
注 册:2009-12-28
收藏
得分:5 
尝试做做看
弄个数组sum,8个变量
求出总得排序方法
加个判断语句
排序总数int num=0;
for(i=0;i<8;i++)
{
    if((sum[i]+1)!=sum[i+1])
    num++;
}
.....

爱拼才会赢
2009-12-28 16:58
eumenides
Rank: 2
等 级:论坛游民
帖 子:18
专家分:36
注 册:2009-12-25
收藏
得分:0 
将问题变了一下:有八个座位,编号为1,2,3,4,5,6,7,8,有八个人,编号为1,2,3,4,5,6,7,8.从这八个人中选七个人坐在这八个座位上,要求:每个人不得坐与自己号码相同的座位(应为每个人前面站的不可能是他自己),相互两个人不能易号而坐,例如不能1号坐3号位,3号坐1号位(因为不可能1号前面是3,3号前面是1),每个人每个座位只能坐一次。
2009-12-30 08:14
烈烈水云天
Rank: 2
来 自:湖南
等 级:论坛游民
帖 子:56
专家分:33
注 册:2009-12-30
收藏
得分:0 
自己再想想,我也想想喝喝

爱拼才会赢
2009-12-30 22:35
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 16楼 烈烈水云天
你知道这个原理 ?

我就是真命天子,顺我者生,逆我者死!
2010-01-08 21:26
快速回复:【求助】容斥原理与鸽巢原理
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018723 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved