HDU 1716 排列2

来源:互联网 发布:淘宝彩票中奖了被改号 编辑:程序博客网 时间:2024/05/16 15:28
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1716
    这道题想法简单,但实际操作却并不容易,难怪看算法书之前,那算法书推荐了不少题目与我,在编程能力未达到之前,算法再好,编不出来,也是徒劳。
    这道题名为排序,故名思意,就是排序。于是我列了个简单的方案,但这方案,我实现了一个下午:
                   1.将所有四位数列出
                   2.排序
                   3.输出
这个思路最难的便是列出所有四位数,确实有几次我差点想换个思路,因为我实在想不到怎么输出四位数,还好,编程最不可缺的便是一股倔强,没有解决不了的问题,只有不敢去尝试的问题。走一步再走一步,翻过那座山,前方就是浩瀚的大海。
    我的代码如下
#includeint main(){    int shu[4] = {1},frist = 1;//shu存四张卡片    while(1)    {        int sum[26], Sum, t = -1;        for(int i = 0; i < 4; i++)//输入四张卡片的数            scanf("%d",&shu[i]);        if(!(shu[0]+shu[1]+shu[2]+shu[3])) break;//当四个为零时退出        if(frist) frist = 0;        else printf("/n");        for(int i = 0; i < 4; i++)//造出所有 i 开头的四位数并排序输出        {            int ok = 0;            for(int j = (i+1)%4; j%4 != i; j++)            {                Sum = shu[i] * 1000 + shu[j%4] * 100;                if((j + 1)%4 == i)                {                    sum[++t] = Sum + shu[(j+2)%4]*10 +shu[(j+3)%4];                    sum[++t] = Sum + shu[(j+3)%4]*10 +shu[(j+2)%4];                }                else if((j+2)%4 == i)                {                    sum[++t] = Sum + shu[(j+1)%4]*10 +shu[(j+3)%4];                    sum[++t] = Sum + shu[(j+3)%4]*10 +shu[(j+1)%4];                }                else                {                    sum[++t] = Sum + shu[(j+1)%4]*10 +shu[(j+2)%4];                    sum[++t] = Sum + shu[(j+2)%4]*10 +shu[(j+1)%4];                }            }            for(int i = t - 5; i <= t; i++)            {                int k = i, p, min = sum[i];                for(int j = i + 1; j <= t; j++)                    if(min > sum[j]) {min = sum[j]; k = j;}                    if(k != i)                    {                        p = sum[i];                        sum[i] = sum[k];                        sum[k] = p;                    }            }            if(t - 10 > 0 && sum[t - 5]/1000 != sum[t - 10]/1000) ok = 1;//如果与上一行的开头不同则可以输出,防止1124这种重复            else if(t - 10 < 0) ok =1;            if(ok)            {                if(sum[t - 5] > 999)                {                    printf("%d", sum[t - 5]);                    for(int i = t - 4; i <= t; i++)                    {                        if(sum[i] != sum[i-1])                            printf (" %d",sum[i]);                    }                    printf("/n");                }            }        }    }    return 0;}