HDoj 1716配列2
3240 ワード
配列2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6181 Accepted Submission(s): 2374
Problem Description
Rayはまた数字の列に興味を持った.
既存の4枚のカードは、この4枚のカードで多くの異なる4桁を並べることができ、これらの4桁を小さい順に出力することが要求されている.
Input
各グループのデータが1行を占め、4枚のカードの数字(0<=数字<=9)を表し、4枚のカードが0であれば入力が終了する.
Output
各カードグループに対して、この4枚のカードからなるすべての4桁を小さい順に出力し、千桁の数字は同じ行で、同じ行の4桁の間にスペースで区切られます.
各グループの出力データ間には1行が空で、最後のグループのデータの後ろには空の行がありません.
Sample Input
Sample Output
Source
2007省試合合宿チーム練習試合(2)
Recommend
lcy | We have carefully selected several similar problems for you: 1719 1717 2097 1521 1112
全配列の新しい関数を使うのは、それ以外のデータの出力方式が面倒です.
ここにもう一つのアルゴリズムを貼って、これは比較的に理解しやすいと感じます
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6181 Accepted Submission(s): 2374
Problem Description
Rayはまた数字の列に興味を持った.
既存の4枚のカードは、この4枚のカードで多くの異なる4桁を並べることができ、これらの4桁を小さい順に出力することが要求されている.
Input
各グループのデータが1行を占め、4枚のカードの数字(0<=数字<=9)を表し、4枚のカードが0であれば入力が終了する.
Output
各カードグループに対して、この4枚のカードからなるすべての4桁を小さい順に出力し、千桁の数字は同じ行で、同じ行の4桁の間にスペースで区切られます.
各グループの出力データ間には1行が空で、最後のグループのデータの後ろには空の行がありません.
Sample Input
1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0
Sample Output
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211
1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210
Source
2007省試合合宿チーム練習試合(2)
Recommend
lcy | We have carefully selected several similar problems for you: 1719 1717 2097 1521 1112
全配列の新しい関数を使うのは、それ以外のデータの出力方式が面倒です.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int a[10],i,j,k,l,m,n=0;
while(scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4])!=EOF)
{
if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0)
break;
if(n)
printf("
");
n=1;
k=1;
do
{
if(a[1]==0)
continue;
if(k==1)
{
printf("%d%d%d%d",a[1],a[2],a[3],a[4]);
k=0;
}
else
{
if(l==a[1])
printf(" %d%d%d%d",a[1],a[2],a[3],a[4]);
else
printf("
%d%d%d%d",a[1],a[2],a[3],a[4]);
}
l=a[1];
}
while(next_permutation(a+1,a+5));//prev_permutation
printf("
");
}
return 0;
}
ここにもう一つのアルゴリズムを貼って、これは比較的に理解しやすいと感じます
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[5],i,j,k,l,m,n,ans[1100000],p;
int ac(int a[])
{
int n=a[0]*1000+a[1]*100+a[2]*10+a[3];
return n;
}
int nm=0;
int main()
{
while(scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]),a[0]+a[1]+a[2]+a[3])
{
if(nm++)
printf("
");
i=0;
ans[i++]=ac(a);
while(next_permutation(a,a+4))
ans[i++]=ac(a);
sort(ans,ans+i);
int cnt=0;
int help=0;
for(j=0;j<i-1;j++)
{
if(ans[j]/1000==0)
continue;
else
{
int cmt=0;
if(ans[j]/1000==ans[j+1]/1000)
cmt=1;
if(cmt==1)
printf("%d ",ans[j]);
else
printf("%d
",ans[j]);
}
}
printf("%d
",ans[j]);
}
}