| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1661 人关注过本帖, 1 人收藏
标题:c语言,如何队列排列
只看楼主 加入收藏
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
TO: woshiyun
经过您的提醒,发现我的全排列中有错误,导致无法全部排列组合。

下面的程序已经改正,输出时确时是3组数据,多了个 4 1 2 3。

程序代码:
/*-----------------------------------------------------------------------------

        输入一个数 n.表示有n个数(n从1开始),再输入一个m,表示下面输入m组数,规定前
    一个数在后一数的前面,输出这列数,如:
    4
    3
    1 2
    2 3
    4 3
    1 2 4 3

------------------------------------------------------------------

        用全排列来作的这个程序,然后在输出时加上限制。不过在输入试验用的
    数据时却出现了两个结果。

        我的这个程序中的“规定前一个数在后一个数的前面”这个条件,是指的同
    一组数据,在仔细思考这个题意时,也没发现理解错误。

        如有高手肯出手指教,不胜感激。

----------------------------------------------------------------------------*/
#include <stdio.h>
#include<string.h>
#define N 100
#define wap(a,b) {int t=a;a=b;b=t;}
int m,n;
int num[N];
int a[N];
/* 检查函数,用于检查输入的数据中是否有超过边界条件的 */
int check()
{
    int i=0;
    for(;i<m*2;++i)
        if(num[i]>n||num[i]<1)    return 0; /* 如果有错误的输入,返回 0 */
    return 1;
}

/*-----输入函数----------------------------*/
void input()
{
    int i;
    printf("input n and m:\n");
    scanf("%d %d",&n,&m);
    for(i=0;i<m*2;i+=2)
        scanf("%d %d",&num[i],&num[i+1]);
    if(!check(num))
    {
        printf("error\n");
        exit(0); /* 如果发现数值不正确,退出 */
    }
    for(i=0;i<n;++i)
        a[i]=i+1; /* 用于输出的数组赋值 */
}
/*------------------输出函数--------------------*/
void print()
{
    int *a1,*a2;
    int i;
    for(i=0;i<m*2;i+=2)
    {
        a1=a2=a;
        while(a1<a+n)
        {
            if(num[i]==*a1)    break;
            a1++;  /* 如果发现相同的数据,退出循环 */
        }
        while(a2<a+n)
        {
            if(num[i+1]==*a2) break;
            a2++;  /* 同上   */
        }
        if(a1>a2)    return; /* 如果发现数据的位置不正确,返回 */
    }
    for(i=0;i<n;++i)
        printf("%d ",a[i]);
    printf("\n"); /* 输出正确的数列 */
}
/*-----------------全排列函数--------------*/
void SORT(int k)
{
    int i;
    if(k+1==n)
    {
        print();
        return ;
    }
    for(i=k;i<n;++i)
    {
        wap(a[k],a[i]);
        SORT(k+1);
        wap(a[k],a[i]);
    }
}
int main(void)
{
    input();
    SORT(0);
    return 0;
}
2008-12-09 09:16
h2008
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-12-8
收藏
得分:0 
这是原题
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。


输入:输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。


输出:给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。


其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
4 3

1 2

2 3

4 3
1 2 4 3

这是我的程序:#include<stdio.h>
int main(void)
{
    int n,m,i,j,fir,sen;
    int a[500]={1};
    while(2==scanf("%d%d",&n,&m))
    {
        for(i=1;i<n;i++)
            a[i]=a[i-1]+1;
     
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&fir,&sen);
            for(i=0;i<n;i++)
                if(a[i]==fir) break;
                for(j=0;j<n;j++)
                    if(a[j]==sen) break;
                    if(i>j)
                    {
                        int temp;
                        temp=a[i];
                        a[i]=a[j];
                        a[j]=temp;
                    }
        }
        for(i=0;i<n;i++)
        {
            printf("%d",a[i]);
            if(i!=n-1) putchar(' ');
        }
        printf("\n");
    }
    return 0;
}


我提交的时候说我超时啊?为什么啊?
2008-12-09 12:48
快速回复:c语言,如何队列排列
数据加载中...
 
   



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

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