非可解問題にポストの対応問題というのがあって。
ポストの対応問題とは、
インスタンス:列の有限集合 {(x_1,y_1),(x_2,y_2)...(x_k,y_k)}
があって、x_i1x_i2...x_in=y_i1y_i2...y_in であるような正数列i_1i_2...i_nが存在するかどうか調べる問題です。
具体例として
{(1,111),(10111,10),(10,0)}
つまりx_1=1,y_1=111,x_2=10111,y_2=10,x_3=10,y_3=0
であり,このとき2113とインスタンスを並べたとき、
x_2x_1x_1x_3=101111110
y_2y_1y_1y_3=101111110
となって同じ数列になる。その他の組み合わせを調べるのに力ずくで見つけるのは、限界があるので、このポストの
対応問題のプログラムは作るろうと思ったのですがプログラム歴が浅いのでまったく歯が立ちませんでした、C言語でどのようにプログラムを作ったらよいでしょうか?
プログラム形として、解の上限数を決めて、x_1=1,y=111,
x_2=10111,y_2=10,x_3=10,y_3=0と入力して、
結果として X=101111110,Y=101111110、解2113、2113の繰り返しを除いたその他のXとYの数列が同じの値と解が出てくるようなプログラムです、質問が分かりにくいとは思いますが、よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
文字列の比較は、xとyの文字をそれぞれstrncatで連結したあとでstrncmpすればいいかと。
サンプル(問題固定、重複解削除なし)です。
文字数を計算しておくとか、解にならない組み合わせを排除しておくなどの工夫をしてないので遅いです。
#include <stdio.h>
#include <string.h>
#define N 20 /* 解の最大長 */
#define M 3 /* 要素数 */
char xstr[M][10]={"1","100","11"};
char ystr[M][10]={"11","0","0"};
int retsu[N];
/* 解(長さnum)の文字列結合&比較 */
void check(int num) {
int i;
char xbuf[N*10]="", ybuf[N*10]="";
for (i=0; i<num; i++) {
strncat(xbuf,xstr[retsu[i]],10);
strncat(ybuf,ystr[retsu[i]],10);
}
if (strncmp(xbuf,ybuf,N*10)==0) {
/* 表示 */
printf("X=%s\n",xbuf);
printf("Y=%s\n",ybuf);
printf("解:");
for (i=0; i<num; i++) {
printf("%d",retsu[i]+1);
}
printf("\n\n");
}
}
/* maxの長さの組合せを作ってretsuに入れる(再帰) */
void kumi(int num, int max) {
int i;
if (num==max) {
check(num);
} else {
for (i=0; i<M; i++) {
retsu[num]=i;
kumi(num+1, max);
}
}
}
/* メイン */
int main(void) {
int i;
for (i=1; i<=N; i++) {
printf("長さ=%d\n",i);
kumi(0, i);
}
return 0;
}
No.1
- 回答日時:
単純に、組み合わせを作る→同じか調べるの繰り返しになると思います。
・組み合わせは、1個の場合(1,2,3)、2個の場合(11,12,13,21,22,23,31,32,33)、3個の場合(111,112,113,121,122,123・・・)と好きなだけ増やしていけばいいですよね。
・同じかどうか調べるのは、xとyを文字列の配列にしておいて、組み合わせの通りつないで、文字列比較するとか。
・重複解の除去は、見つけた解を保存しておいて、新しく見つけた解と今までの解を(前方一致で)比較すればいいような。
とりあえずできてるとこだけでもプログラムを見せてもらえたらコメントできると思いますが。
この回答への補足
回答ありがとうございます。
考えたプログラムです、配列の比較が分からなかったので
すごく短いプログラムになってます。
#include<stdio.h>
#include<string.h>
main()
{
char x1[10],x2[10],x3[10];
char y1[10],y2[10],y3[10];
char X[100],Y[100];
int m1,m2,m3,n1,n2,n3;
/*0か1の値を代入する。*/
scanf("%s",x1); /* x1,y1で1つの要素 */
scanf("%s",y1);
scanf("%s",x2); /* x2,y2で1つの要素 */
scanf("%s",y2);
scanf("%s",x3); /* x3,y3で1つの要素 */
scanf("%s",y3);
m1=strlen(x1);
n1=strlen(y1);
m2=strlen(x2);
n2=strlen(y2);
m3=strlen(x3);
n3=strlen(y3);
}
作りたいプログラムは、
x1=1 x2=100 x3=11
y1=11 y2=0 y3=0
と入力したとき、
X=11111100
Y=11111100
解:11132
X=11001111
Y=11001111
解:12311
:
:
と表示してくれるプログラムです。x1,y1を要素1、x2,y2を要素2、x3,y3を要素3として解で表示される1,2,3は、この要素1,2,3です。
配列x1,y1...x3,y3はそれぞれ長さが異なるので、strncmpなど文字列の比較が上手くできません。
http://www.is.titech.ac.jp/~watanabe/csbook/erra …
このホームページにポストの対応問題についての簡単な説明があります。よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Java Java、配列の問題を教えて欲しいです。 ・日、月、火、水、木、金、土 ・各曜日の英語 を2次元配列 2 2023/07/10 19:14
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- 数学 すべての自然数とすべての実数を1対1で対応させる(すべての実数を一列に並べる)方法について 3 2023/05/26 17:14
- 数学 回答の意味について 3 2023/07/06 14:14
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 数学 実数同士の全単射写像について 2 2023/07/05 17:12
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 1 2022/06/18 21:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
if と配列の組み合わせ
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
(int *)の意味
-
足して100になるような乱数のア...
-
PowerShellがうまくいかない
-
C言語 エラーの原因がわからな...
-
C言語で行列の積を計算できるよ...
-
C#で配列の分割
-
ポインタを使って関数の値の...
-
C言語 逆順の配列の仕方を教え...
-
因数分解を行うプログラムについて
-
各桁の和を返す関数
-
引数 戻り値 return文について
-
C言語で三目並べをするプログラ...
-
円周率
-
C言語の問題です。大至急回答お...
-
わかりません・・・。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報