| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1169 人关注过本帖
标题:C语言 信封
只看楼主 加入收藏
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:6 
C语言 信封
试编程求出完全装错情形的所有方式及其总量s。例如,输入n=3,即有3封信需要装入信封,完全装错的一种方式可以表示为312,表示第1封信装入第3个信封,第2封信装入第1个信封,第3封信装入第2个信封。对于n=3,完全装错的方式共有2种,分别是312和231.

我知道可能需要用两个数组,但是表达不出来,求不用指针的做法!

[ 本帖最后由 傻瓜菜 于 2011-11-13 14:42 编辑 ]
搜索更多相关主题的帖子: C语言 编程 信封 
2011-11-13 14:41
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
收藏
得分:0 
直接数学推导

a[n]=(n-1)*(a[n-1]+a[n-2])

********多贴代码,少说空话*******
2011-11-13 15:00
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
(一)我觉得和八皇后问题有些相像。
(二)全排列,再去掉不符合的。

[ 本帖最后由 laznrbfe 于 2011-11-14 11:33 编辑 ]
2011-11-13 22:53
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:5 
程序代码:
#include<stdio.h>
#define NUM 100 /*定义数组的大小*/
int a[NUM+1];
int main()
{
    int i,k,flag,not_finish=1,count=0,flag_2;
    i=1; /*正在处理的元素下标,表示前i-1个元素已符合要求,正在处理第i个元素*/
    a[1]=1; /*为数组的第一个元素赋初值*/
    int n;
    do
    {
        printf("输入信封数量:");
        scanf("%d",&n);
    }while(n<1);
    printf("结果如下:\n");
    if(n==1)
    {
        printf("没有错误的可能。\n");
    }
    else if(n==2)
    {
        printf(" [ 1]:  2 1\n");
    }
    else
    {
        while(not_finish) /*not_finish=1:处理尚未结束*/
        {
            while(not_finish&&i<=n) /*处理尚未结束且还没处理到第n个元素*/
            {
                for(flag=1,k=1;flag&&k<i;k++) /*判断是否有多个皇后在同一行*/
                {
                    if(a[k]==a[i])flag=0;
                }
                //    for(k=1;flag&&k<i;k++) /*判断是否有多个皇后在同一对角线*/
                //        {
                //            if((a[i]==a[k]-(k-i))||(a[i]==a[k]+(k-i)))  flag=0;
                //        }
                if(!flag) /*若存在矛盾不满足要求,需要重新设置第i个元素*/
                {
                    if(a[i]==a[i-1]) /*若a[i]的值已经经过一圈追上a[i-1]的值*/
                    {
                        i--; /*退回一步,重新试探处理前一个元素*/
                        if(i>1&&a[i]==n)
                            a[i]=1; /*当a[i]为n时将a[i]的值置1*/
                        else if(i==1&&a[i]==n)
                            not_finish=0; /*当第一位的值达到n时结束*/
                        else a[i]++; /*将a[i]的值取下一个值*/
                    }
                    else if(a[i]==n) a[i]=1;
                    else a[i]++; /*将a[i]的值取下一个值*/
                }
                else if(++i<=n)
                {
                    if(a[i-1]==n) a[i]=1; /*若前一个元素的值为NUM则a[i]=1*/
                    else a[i]=a[i-1]+1; /*否则元素的值为前一个元素的下一个值*/
                }
            }
            if(not_finish)
            {
                flag_2=1;
                for(int kk=1;kk<=n;kk++)
                {
                    if(a[kk]==kk)
                        flag_2=0;
                }
                if(flag_2==1)
                {
                    ++count;
                    printf((count-1)%3?"\n [%2d]: ":"\n [%2d]: ",count);
               
                    for(k=1;k<=n;k++) /*输出结果*/
                    {
                   
                        printf(" %d",a[k]);
                    }
                }
                if(a[n-1]<n) a[n-1]++; /*修改倒数第二位的值*/
                else a[n-1]=1;
                i=n-1; /*开始寻找下一个足条件的解*/
            }
        }
    }
    printf("\n");
    return 0;
}
2011-11-14 10:59
gxu888
Rank: 2
等 级:论坛游民
帖 子:19
专家分:33
注 册:2011-11-10
收藏
得分:15 
回复 4楼 laznrbfe
你好!能否给我发一个C软件?我找了好久 都没找到。谢谢!祝好!QQ576027318 邮箱:zhaorui0612@
2011-11-14 11:04
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 5楼 gxu888
你的QQ我加不了,我的379504075
2011-11-14 11:15
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:0 
我也写了一个,思路是把n个信封当n位n进制数处理,数组中每个成员存一位数,在所有可能存在的可能中找出满足条件的数,因我是从0开始算起,为了直观最后输出时做了+1.
可能效率不是太高,还请高手指点。
程序代码:
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "math.h"

int num[30]={0};

int add(int i,int n)//对数组进行+1处理,达到最大数向前进1,同时当前位置0.
{
    num[i]++;
    if(i==0&&num[i]>n)
    {
        printf("数据出错");
        return 0;
    }
    else if (num[i]>=n)//大于n表示要向前进一位
     {
           num[i]=0;
           return add(i-1,n);
          
     }
    return 1;
}

int camp(int n)//对各位数进行比较处理
{
    int i,ok;
    if(num[n]==n)//n位上等于n,信正确反回错
    {
        return 0;
    }
    if(n==0)
        return 1;
    else
        {
            ok=camp(n-1);
            if (!ok)
                return 0;
        }
    for (i=n-1;i>=0;i--)
    {
        if(num[i]==num[n])//有相同数,反回错
        {
            return 0;
        }
    }
    return 1;
   
}

int main()
{
    int n=1,n2,i,j,ok,count=0,p;
    printf("请输入信封数:");
    scanf("%d",&n);
    while(n<=1)
    {
        printf("请输入一个大于1的整数:");
        scanf("%d",&n);
    }

    n2=pow(n,n);
    for(i=0;i<n2;i++)
    {
        add(n-1,n);

 //       for(p=0;p<n;p++)

 //          printf("%d",num[p]);

 //       printf("\n");
        ok=camp(n-1);
        if(ok)
        {
            count++;
            for(j=0;j<n;j++)
            {
                printf("%d",num[j]+1);
            }
            printf("  ");
            if(count%10==0)
                printf("\n");
        }
    }
    printf("\n最大全错数为:%d\n",count);
    return 1;
}
   


 
2011-11-14 20:26
快速回复:C语言 信封
数据加载中...
 
   



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

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