现在的位置: 首页 > 综合 > 正文

HDU 1716 排列2

2013年01月21日 ⁄ 综合 ⁄ 共 1345字 ⁄ 字号 评论关闭

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1716

    这道题想法简单,但实际操作却并不容易,难怪看算法书之前,那算法书推荐了不少题目与我,在编程能力未达到之前,算法再好,编不出来,也是徒劳。
    这道题名为排序,故名思意,就是排序。于是我列了个简单的方案,但这方案,我实现了一个下午:
                   1.将所有四位数列出
                   2.排序
                   3.输出
这个思路最难的便是列出所有四位数,确实有几次我差点想换个思路,因为我实在想不到怎么输出四位数,还好,编程最不可缺的便是一股倔强,没有解决不了的问题,只有不敢去尝试的问题。走一步再走一步,翻过那座山,前方就是浩瀚的大海。
    我的代码如下
#include
int 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;
}

抱歉!评论已关闭.