プログラミングの学習で詰まってしまいました。アルゴリズムだけでもわかる方いらっしゃらないでしょうか。
「問題」
1 から N までの数字からなる長さ N の文字列 S が与えられます。 あなたは、この文字列に対し以下の操作を M 回繰り返します。
S の 1 文字目を取り除く。書かれている数が A とすると、A 番目にその数字を挿入する。
例えば、文字列 36452412 に対してこの操作を行うと 64352412 となります。 S に M 回操作を行って得られる文字列を出力してください。
制約
1≤|S|≤9
S は 1 から |S| までの数字からなる
0≤M≤1018
入力例
36452412
1
出力例
64352412
//36452412 に対して一回操作を行うと 64352412 になります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/25 15:14
回答6件
0
アルゴリズムは記載のとおりでしょ。
「文字列 S」を用意する。
「S の 1 文字目を取り除く。書かれている数が A とすると、A 番目にその数字を挿入する。」
「 S に M 回操作」を行う。
投稿2016/04/25 08:33
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/25 08:52
退会済みユーザー
2016/04/25 09:30
0
操作の方法は書いてあるからそのままコードに落としこむだけでしょう。
何がわからないのでしょう?
処理の方法でしょうか?
それならN桁の数字を「N桁の数」として処理するのはなく各桁を全部1桁の数としてバラして処理すればいいのでは?
6桁なら6個のint型の配列を用意して全部バラして配列に入れたら後は入れ替えだけになります。
投稿2016/04/25 08:55
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/25 08:57
2016/04/25 09:23
0
ベストアンサー
問題を素直にC++に落とし込むとこうなりますかね。
C++
1#include <iostream> 2#include <deque> 3 4int main() { 5 using namespace std; 6 deque<int> S = { 3, 6, 4, 5, 2, 4, 1, 2 }; 7 const int M = 3; // 以下の処理をM回くりかえす 8 for ( int i = 0; i < M; ++i ) { 9 int A = S.front(); // 先頭文字をAとする 10 S.pop_front(); // 先頭文字を取り除く 11 S.insert(S.begin()+A, A); // SのA番目にAを挿入する 12 cout << i+1 << " : "; 13 for ( int n : S ) cout << n; cout << endl; 14 } 15}
投稿2016/04/26 00:44
総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/26 00:54
2016/04/26 07:51
2016/04/26 12:23
2016/04/27 21:42
2016/04/27 23:22
2016/04/28 01:42
2016/04/28 07:54
0
「S の 1 文字目を取り除く。書かれている数が A とすると、A 番目にその数字を挿入する。」
配列で考えた場合・・・
1.S の 1 文字目を取り除く→先頭の文字Aを取り出す。Aを数値に変換してその分前詰めする。
2.A 番目にその数字を挿入する→1で空いた場所にAを入れる。
1と2をM回行う。
注)配列は0から始まる事を忘れないように・・・
投稿2016/04/25 21:49
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
... S に M 回操作を行って得られる文字列を...
この問題の本当の狙いは、手続きをコードに落とすことではなくて、
なんらかの法則性をみつけて、それを利用して効率よく変換結果の文字列を求めることなのではないでしうか?
1000億回の操作をおこなった結果を求めるとしたら、機械なら文句を言わずに1000億回の操作をするでしょう。
でも、人間なら、何回か操作したら、繰り返しが現れることに気が付くはずです。
仮に10 回目で最初の文字列にもどったとしたら、1000 億回の操作の文字列は最初の文字と同じだと即答できます。(1000 億は 10 の倍数だから)
特に この問題の操作では, 先頭の文字が 1 の場合は操作しても変化が起こらないので、 即答できますね。
- 質問文について疑問があります。
.... 1 から N までの数字からなる長さ N の文字列 ...
とかかれているのに、サンプルは 36452412 です。これは 1..6 からなる長さ 8 の文字列です。
問題文が間違っているのか、サンプルが不適切なのか どちらなのでしょう。
- 蛇足:
S1, S2 の2つの文字列があたえられたときに、
S1 に何回の操作をしたら S2 になるか、あるいは何回操作しても S2 にならないかをなるべく速く判定するプログラムを書くことは可能でしょうか?
追記: 2016-04-27
N = 3 の場合の文字列の変化は次パターンがあります。
(操作をしても変化をしなくなる部分は *xxx のように書いています)
[*123]
[*132]
[213, *123]
[321, 213, *123]
[312, *123]
つまり、M >= 3 なら S の値によらず、結果は常に 123 となります。
また、 213 -> 132 へ変換されることは無いということです。
N = 3 の場合、一番長い変換シーケンスは [321, 213, *123] です。
他の N について、一番長い変換シーケンスを求めるプログラムを書くことは可能でしょうか?
投稿2016/04/26 14:40
編集2016/04/26 21:33総合スコア22324
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。