| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3350 人关注过本帖, 2 人收藏
标题:一个烦人的算法题。。。高手请进!!!
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
10个重复?草狼兄弟,我有点生气了。

请仔细看一下代码,我是故意多输出10次,以验证当达到排列的最大值后可以返回到第一组排列重新开始。

重剑无锋,大巧不工
2012-05-31 19:57
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 31楼 beyondyf
只看结果了, 没看代码, 不好意思啊
2012-05-31 20:14
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
算了吧。回到我的调查,我可以认为你能解楼主的问题么?回答能,我将给你加分。

重剑无锋,大巧不工
2012-05-31 20:17
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 33楼 beyondyf
收到的鲜花
  • beyondyf2012-05-31 20:27 送鲜花  45朵  
2012-05-31 20:23
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
开始看杨大哥的代码 琢磨了半天 还是没弄明白 后来没办法去调试了下 单步跟踪才理出头绪
原来杨大哥是先找逆序终结下标(我的算法这里一样) 在把逆序改成顺序排列 最后将这个部分段的前一位和他逐个比较
大小 第一个比他大的就实施交换 如果原排列是全逆序 就return 单独输出
这个算法很好  我那个就绕了 我是先找要交换的那个数 然后再顺序排 别看就是个次序颠倒 做起来麻烦大多了
还学到了一手 用puts("")来输出换行

梅尚程荀
马谭杨奚







                                                       
2012-05-31 20:51
qq383264679
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:155
专家分:130
注 册:2012-1-19
收藏
得分:1 
我也不能·!~
2012-05-31 21:00
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:1 
今晚打开论坛一看有一道题置顶,我一看,还有一点想法,就试着写了一下,我是学土木的,不是计算机专业的,写的有一些乱,
那位大哥有耐心看完给点意见,小弟感激不尽!
加了一些注释,我写的树我自己感觉都不太像树,用的是一个双向的单链表,加上其他的一个标志,但我在逻辑上是把它当成树了,我数据结构只看了半本,没有看完,有些地方是多不像,术语也用得不太准确,多多包涵!
程序代码:
#include<stdio.h>
#include<stdlib.h>
void fun(int n,int k,int *p);
int main()
        {    int m,a,b;
            struct x{
                        int n;
                        int k;
                        int *p;
                    }*ptr;
            printf("输入:\n");
            scanf("%d",&m);
            ptr=(struct x*)malloc(m*sizeof(struct x));            
            for(a=0;a<m;a++)
                {
                    scanf("%d %d",&ptr[a].n,&ptr[a].k);
                    ptr[a].p=(int *)malloc(sizeof(int)*ptr[a].n+1);
                    for(b=0;b<ptr[a].n;b++)
                    scanf("%d",&ptr[a].p[b]);
                    printf("--------------------------------------------\n");

                }
            for(a=0;a<m;a++)
                fun(ptr[a].n,ptr[a].k,ptr[a].p);
           for(a=0;a<m;a++)
        free(ptr[a].p);
        free(ptr);
            return 0;
        }
int m(int *pti,int n,int a);/*这个函数的功能有两个,当a=0时找出的事最小的一个没有被使用的数,当a!=0时找出的是a之后的最小的那个数(此数大于a小于n),没有找到返回0*/
void fun(int n,int k,int *p)
        {    struct date{
                        char a;
                        int flag,j;
                        struct date *front;
                        struct date *next;
                        }*head,*q,*t;/*这是节点的结构,a用来存放该节点的数据,flag用来标识该节点还有多少个兄弟节点没有遍历,j只与节点所在的深度有关,记录有多少个子节点*/
            
            int s,*pti,sum,tempt;int *ptc=p;
            pti=(int*)malloc(sizeof(int)*n+1);/*pti指向的是一个数组,记录一个数有没有被使用,该数就是数组的下标,0表示没有被使用,1表示已经被使用*/
            for(s=1;s<=n;s++)
                pti[s]=0;/*报所有的元素的置为0*/
            q=head=(struct date*)malloc(sizeof(struct date));/*头结点*/
            head->a=0;
            head->front=NULL;
            head->next=NULL;
            head->flag=head->j=n;
            for(s=n;s>0;s--)/*初始化开始树(更像是双向链表),就是把给出的排列放入树中*/
                {
                    t=(struct date*)malloc(sizeof(struct date));
                    t->flag=t->j=s-1;
                    t->front=q;
                    t->next=NULL;
                    t->a=*(ptc);
                    pti[*(ptc++)]=1;/*记录下已经使用过的元素*/
                    q->next=t;
                    q=t;
                }
            for(sum=0;sum!=k;)
                {    t=q;
                    while(t->flag==0)/*往回找到应该改变的那一个节点*/
                        {    
                            pti[t->a]=0;
                            t=t->front;
                        }
                    do{
                            
                            pti[t->a]=0;
                            tempt=t->a=m(pti,n,t->a);
                            t=t->front;
                        }while(tempt==0&&t!=head);/*m函数返回为0的时候,表示没有大于t->a且小于n的没有使用的数,此时为保证从大到小的顺序,要改变上一个节点的数*/
                    if(t==head&&tempt==0)/*当找到最后的时候,要返回从最小的开始找*/
                        {
                            t=t->next;
                            t->a=m(pti,n,0);
                        }
                    else
                        {t=t->next;}
                    
                    pti[t->a]=1;
                    t->flag--;/*一个兄弟没了*/
                    t=t->next;
                    while(t!=NULL)/*为t节点后面的节点选择该使用的数*/
                        {
                            t->flag=t->j;
                            t->a=m(pti,n,0);
                            pti[t->a]=1;
                            t=t->next;
                        }
                    sum++;    
                }
            t=head->next;
            printf("输出:\n");
            while(t!=NULL)
                {
                    printf("%d ",t->a);
                    t=t->next;
                }
            printf("\n");
            t=q=head;
            while(q!=NULL)
                {
                    t=q;
                    q=q->next;
                    free(t);
                }
            free(pti);
            
                
        }
int m(int *pti,int n,int a)/*这个函数的功能有两个,当a=0时找出的事最小的一个没有被使用的数,当a!=0时找出的是a之后的最小的那个数(此数大于a小于n),没有找到返回0*/
        {
            int s;
            for(s=1;s<=n&&!a;s++)
                if(pti[s]==0)
                    return s;
            for(s=a+1;a&&s<=n;s++)
                if(pti[s]==0)
                    return s;
            return 0;
        }

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 饭桶 于 2012-6-1 09:06 编辑 ]
收到的鲜花
  • beyondyf2012-05-31 23:17 送鲜花  45朵  

人得一生得奋斗!
2012-05-31 22:32
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 37楼 饭桶
哇 我感觉我的程序绕 看了你的心里平衡了

梅尚程荀
马谭杨奚







                                                       
2012-05-31 22:41
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 38楼 有容就大
恩,我用的是树,编写起来是太绕了!
不过要求的输入也不容易啊,光输入就占了一大段!
我感觉心凉了一小下!

[ 本帖最后由 饭桶 于 2012-5-31 22:46 编辑 ]

人得一生得奋斗!
2012-05-31 22:43
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 39楼 饭桶
不过有很多值得借鉴的地方 你要是能注释下更好 不然要看懂还真要点功夫。
明天调试下看看 要睡了 晚安。

梅尚程荀
马谭杨奚







                                                       
2012-05-31 22:46
快速回复:一个烦人的算法题。。。高手请进!!!
数据加载中...
 
   



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

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