1064:JAM表記
時間制限:1秒メモリ制限:128 MB
送信:19解像度:5
[ 送信 ] [ ステータス ] [ ディスカッション掲示板 ] [プロテクター:外部インポート]
タイトル説明
ジャムは革新的であることを好むフランケンシュタインです。アラビア数字は使わず、小文字の英字を使って数えることで、世界がよりカラフルになると感じています。彼のカウント方法では、各数字の桁数は同じで(同じ文字数を使用)、英語のアルファベットは元の順序であり、前の文字は後の文字よりも小さいです。このような「番号」をJam番号と呼びます。Jam番号では、各文字は互いに異なり、厳密に左から右に増加します。Jamは使用する文字の範囲も毎回指定します。たとえば、2から10までです。つまり、これらの文字は{b、c、d、e、f、g、h、i、j}のみ使用できます。さらに桁数を5と指定した場合、Jam番号「bdfij」の直後の数字は「bdghi」になります。(Jam番号「bdfij」と「bdghi」を順に表すためにUとVを使用する場合、U <VでJam番号Pがないため、U <P <Vです)。ファイルから読み込まれたJam番号の場合、次の5つのJam番号を順に出力します。Jam番号があまり多くない場合は、Jam番号が少ない場合はいくつかを出力します。
入る
2行あり、最初の行はスペースで区切られた3つの正の整数
です: stw(sは使用される最小の文字のシリアル番号、tは使用される最大の文字のシリアル番号。wは桁数、これらの3つの数値
は、1≤s <T≤26、2≤w≤ts) を満たします。2行目は、w小文字の文字列であり、要件を満たすJam数です。
与えられたデータは正確であり、検証は必要ありません。
出力
最大は5行で、入力Jam桁の直後の5 Jam桁です。後ろにJam桁がそれほど多くない場合は、数行だけが出力されます。1行に出力されるJam番号は1つだけです。これは、余分なスペースを含まない小文字のwで構成される文字列です。
入力例
2 10 5 bdfij
出力例
bdghi bdghj bdgij bdhij befgh
分析:
通常の完全配置との1つの違いは、この質問では固定配置から開始するために完全配置が必要であることです。DFSでループが最初のループかどうかを判断する必要があります。最初のループである場合は、指定された位置から開始し、そうでない場合はゼロから開始します。
コード:
#include<bits/stdc++.h>
using namespace std;
bool visit[26];
char ans[26], orin[26];
int s, t, w, times;
void dfs(int depth, int i)
{
if (times == 5)return;
if (depth == w)
{
cout << ans << endl;
times++;
}
else
{
if (!visit[depth]){
i = orin[depth] - '`';//'`'=='a'-1
visit[depth] = 1;
}
for (; i <= t; i++)
{
ans[depth] = '`' + i;
dfs(depth + 1, i + 1);
}
}
}
int main()
{
cin >> s >> t >> w >> orin;
orin[w - 1]++;
dfs(0, 0);
return 0;
}