题目链接: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;
}