トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

ABC-029-C Brute-force Attack

■■■問題■■■

あなたはスーパーハッカーです。高橋君を攻撃対象に定めたあなたは、
高橋君のパソコンのパスワードに関して次の事実を突き止めました。

●長さはN文字である。
●a, b, c 以外の文字は含まれない。

高橋君のパソコンのパスワードの候補として考えられる文字列をすべて列挙してしまいましょう。

■■■入力■■■

N

1行目にパスワードの長さ N (1 <= N <= 8) が与えられる。

■■■出力■■■

標準出力に、問題文中の2つの条件をともに満たす文字列すべてを1行に1個ずつ辞書順に出力せよ。
最後の文字列の後ろにも改行を入れること。大文字と小文字は区別される。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input2";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("1");
            //a
            //b
            //c
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2");
            //aa
            //ab
            //ac
            //ba
            //bb
            //bc
            //ca
            //cb
            //cc
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct JyoutaiDef
    {
        internal List<char> CharList;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int N = int.Parse(InputList[0]);

        var que = new Queue<JyoutaiDef>();
        JyoutaiDef WillPush;

        for (char I = 'a'; I <= 'c'; I++) {
            WillPush.CharList = new List<char>() { I };
            que.Enqueue(WillPush);
        }

        while (que.Count > 0) {
            JyoutaiDef Dequeued = que.Dequeue();

            //クリア判定
            if (Dequeued.CharList.Count == N) {
                Console.WriteLine(new string(Dequeued.CharList.ToArray()));
                continue;
            }

            for (char I = 'a'; I <= 'c'; I++) {
                WillPush.CharList = new List<char>(Dequeued.CharList) { I };
                que.Enqueue(WillPush);
            }
        }
    }
}


解説

幅優先探索で重複順列を列挙してます。