1~4の4つの数の全ての順列を下記の順に書き出すプログラムを作成しなさい.という課題ですが、規則性がわかりません。方針だけでも教えてほしいです。よろしくお願いします。
1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
規則がわからりません
Re: 規則がわからりません
そのまんま埋め込むのが簡単でしょう。
#include <stdio.h>
int main(void) {
static const char* data[] = {
"1234", "1243", "1324", "1342", "1432", "1423",
"2134", "2143", "2314", "2341", "2431", "2413",
"3214", "3241", "3124", "3142", "3412", "3421",
"4231", "4213", "4321", "4312", "4132", "4123",
NULL
};
const char** p;
for (p = data; *p != NULL; p++) {
puts(*p);
}
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 規則がわからりません
{234}で2,3,4から作られる順列の全体を表すことにすると
{1234}は
1{234} (最初が1の順列)
2{134} (最初が2の順列 {134}は1234から1番目と2番目を交換して作った)
3{214} (最初が3の順列 {214}は1234から1番目と3番目を交換して作った)
4{231} (最初が4の順列 {213}は1234から1番目と4番目を交換して作った)
と分けられます。
同様に
{234}は
2{34}(最初が2の順列)
3{24}(最初が3の順列 {24}は234から1番目と2番目を交換して作った)
4{32}(最初が4の順列 {32}は234から1番目と3番目を交換して作った)
{34}は
34
43
であることは明らかです。
つまり
12{34}
13{24}
14{32}
21{34}
23{14}
24{31}
32{14}
31{24}
34{12}
42{31}
43{21}
41{32}
と分け、最終的にこの順列になることになります。
{1234}は
1{234} (最初が1の順列)
2{134} (最初が2の順列 {134}は1234から1番目と2番目を交換して作った)
3{214} (最初が3の順列 {214}は1234から1番目と3番目を交換して作った)
4{231} (最初が4の順列 {213}は1234から1番目と4番目を交換して作った)
と分けられます。
同様に
{234}は
2{34}(最初が2の順列)
3{24}(最初が3の順列 {24}は234から1番目と2番目を交換して作った)
4{32}(最初が4の順列 {32}は234から1番目と3番目を交換して作った)
{34}は
34
43
であることは明らかです。
つまり
12{34}
13{24}
14{32}
21{34}
23{14}
24{31}
32{14}
31{24}
34{12}
42{31}
43{21}
41{32}
と分け、最終的にこの順列になることになります。
-
- 記事: 48
- 登録日時: 7年前
Re: 規則がわからりません
//こんな感じでしょうか?
#include<stdio.h>
#include<stdlib.h>
int table[4]={1,2,3,4};
//1234
int main()
{
int num=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
for(int k=0;k<4;k++)
{
for(int l=0;l<4;l++)
{
if(i!=j && i!=k && i!=l && j!=k && j!=l && k!=l && l!=j)
{
printf("%d%d%d%d\n",table[i],table[j],table[k],table[l]);
num++;
}
}
}
}
}
printf("%d回実行されました。\n",num);
return 0;
}