using System;
using System.Collections .Generic ;
class Program
{
private static char [ ] arr = new char [ ] { 'a' , 'c' , 'b' , 'd' } ;
private static Dictionary< char , int> dic = new Dictionary< char , int> ( )
{
{ 'a' , 0 } , { 'c' , 1 } , { 'b' , 2 } , { 'd' , 3 }
} ;
static void Main( string[ ] args)
{
Console.WriteLine ( "Example no 1:" ) ;
Display( Generate( 1 ) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Example no 2:" ) ;
Display( Generate( 2 ) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Example no 3:" ) ;
Display( Generate( "ab" , 5 ) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Example no 4:" ) ;
Display( Generate( "dc" , 10 ) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Example no 5:" ) ;
Display( Generate( "ab" , 0 ) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Example no 6:" ) ;
Display( Generate( 3 ) ) ;
Console.WriteLine ( ) ;
}
public static void Display( List< string> list)
{
list.ForEach ( i => Console.Write ( "{0} " , i) ) ;
}
public static List< string> Generate( int length)
{
char [ ] seed = new char [ length] ;
for ( int i = 0 ; i < length; i++ )
seed[ i] = arr[ 0 ] ;
int count = - 1 ;
checked { count = ( int ) Math.Pow ( arr.Length , length) ; }
return Generate( new string( seed) , count, true ) ;
}
public static List< string> Generate( string seed, int count)
{
return Generate( seed, count, false ) ;
}
private static List< string> Generate( string seed, int count, bool includeSeed)
{
List< string> result = new List< string> ( ) ;
if ( includeSeed)
result.Add ( seed) ;
if ( result.Count < count)
Generate( seed.ToCharArray ( ) , result, count) ;
return result;
}
private static void Generate( char [ ] previous, List< string> result, int count)
{
char [ ] current = new char [ previous.Length + 1 ] ;
bool copy = false ;
for ( int i = previous.Length - 1 ; i >= 0 ; i-- )
{
if ( copy)
current[ i + 1 ] = previous[ i] ;
else
{
int index = dic[ previous[ i] ] ;
if ( index < arr.Length - 1 )
{
current[ i + 1 ] = arr[ index + 1 ] ;
copy = true ;
}
else
current[ i + 1 ] = arr[ 0 ] ;
}
}
if ( copy)
result.Add ( new string( current, 1 , current.Length - 1 ) ) ;
else
{
current[ 0 ] = arr[ 0 ] ;
result.Add ( new string( current) ) ;
}
if ( result.Count < count)
Generate( result[ result.Count - 1 ] .ToCharArray ( ) , result, count) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCmNsYXNzIFByb2dyYW0KewogICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFyciA9IG5ldyBjaGFyW10geyAnYScsICdjJywgJ2InLCAnZCcgfTsKCiAgICBwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PGNoYXIsIGludD4gZGljID0gbmV3IERpY3Rpb25hcnk8Y2hhciwgaW50PigpIAogICAgewogICAgICAgIHsgJ2EnLCAwIH0sIHsgJ2MnLCAxIH0sIHsgJ2InLCAyIH0sIHsgJ2QnLCAzIH0KICAgIH07CgogICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlIG5vIDE6Iik7CiAgICAgICAgRGlzcGxheShHZW5lcmF0ZSgxKSk7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgbm8gMjoiKTsKICAgICAgICBEaXNwbGF5KEdlbmVyYXRlKDIpKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhhbXBsZSBubyAzOiIpOwogICAgICAgIERpc3BsYXkoR2VuZXJhdGUoImFiIiwgNSkpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlIG5vIDQ6Iik7CiAgICAgICAgRGlzcGxheShHZW5lcmF0ZSgiZGMiLCAxMCkpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGFtcGxlIG5vIDU6Iik7CiAgICAgICAgRGlzcGxheShHZW5lcmF0ZSgiYWIiLCAwKSk7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4YW1wbGUgbm8gNjoiKTsKICAgICAgICBEaXNwbGF5KEdlbmVyYXRlKDMpKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBEaXNwbGF5KExpc3Q8c3RyaW5nPiBsaXN0KQogICAgewogICAgICAgIGxpc3QuRm9yRWFjaChpID0+IENvbnNvbGUuV3JpdGUoInswfSAiLCBpKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBMaXN0PHN0cmluZz4gR2VuZXJhdGUoaW50IGxlbmd0aCkKICAgIHsKICAgICAgICBjaGFyW10gc2VlZCA9IG5ldyBjaGFyW2xlbmd0aF07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgICAgc2VlZFtpXSA9IGFyclswXTsKCiAgICAgICAgaW50IGNvdW50ID0gLTE7CiAgICAgICAgY2hlY2tlZCB7IGNvdW50ID0gKGludClNYXRoLlBvdyhhcnIuTGVuZ3RoLCBsZW5ndGgpOyB9CgogICAgICAgIHJldHVybiBHZW5lcmF0ZShuZXcgc3RyaW5nKHNlZWQpLCBjb3VudCwgdHJ1ZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBMaXN0PHN0cmluZz4gR2VuZXJhdGUoc3RyaW5nIHNlZWQsIGludCBjb3VudCkKICAgIHsKICAgICAgICByZXR1cm4gR2VuZXJhdGUoc2VlZCwgY291bnQsIGZhbHNlKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBMaXN0PHN0cmluZz4gR2VuZXJhdGUoc3RyaW5nIHNlZWQsIGludCBjb3VudCwgYm9vbCBpbmNsdWRlU2VlZCkKICAgIHsKICAgICAgICBMaXN0PHN0cmluZz4gcmVzdWx0ID0gbmV3IExpc3Q8c3RyaW5nPigpOwogICAgICAgIGlmIChpbmNsdWRlU2VlZCkKICAgICAgICAgICAgcmVzdWx0LkFkZChzZWVkKTsKCiAgICAgICAgaWYgKHJlc3VsdC5Db3VudCA8IGNvdW50KQogICAgICAgICAgICBHZW5lcmF0ZShzZWVkLlRvQ2hhckFycmF5KCksIHJlc3VsdCwgY291bnQpOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgR2VuZXJhdGUoY2hhcltdIHByZXZpb3VzLCBMaXN0PHN0cmluZz4gcmVzdWx0LCBpbnQgY291bnQpCiAgICB7CiAgICAgICAgY2hhcltdIGN1cnJlbnQgPSBuZXcgY2hhcltwcmV2aW91cy5MZW5ndGggKyAxXTsKCiAgICAgICAgYm9vbCBjb3B5ID0gZmFsc2U7CiAgICAgICAgZm9yIChpbnQgaSA9IHByZXZpb3VzLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNvcHkpCiAgICAgICAgICAgICAgICBjdXJyZW50W2kgKyAxXSA9IHByZXZpb3VzW2ldOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGRpY1twcmV2aW91c1tpXV07CgogICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgYXJyLkxlbmd0aCAtIDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFtpICsgMV0gPSBhcnJbaW5kZXggKyAxXTsKICAgICAgICAgICAgICAgICAgICBjb3B5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjdXJyZW50W2kgKyAxXSA9IGFyclswXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNvcHkpCiAgICAgICAgICAgIHJlc3VsdC5BZGQobmV3IHN0cmluZyhjdXJyZW50LCAxLCBjdXJyZW50Lkxlbmd0aCAtIDEpKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBjdXJyZW50WzBdID0gYXJyWzBdOwogICAgICAgICAgICByZXN1bHQuQWRkKG5ldyBzdHJpbmcoY3VycmVudCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJlc3VsdC5Db3VudCA8IGNvdW50KQogICAgICAgICAgICBHZW5lcmF0ZShyZXN1bHRbcmVzdWx0LkNvdW50IC0gMV0uVG9DaGFyQXJyYXkoKSwgcmVzdWx0LCBjb3VudCk7CiAgICB9Cn0K