正しい文(クイズ)
Posted feedbacks - C#
#4382を移植
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | const string ALNUM = "0123456789abcdefghijklmnopqrstuvwxyz";
static void Main(string[] args)
{
for (int i = 2; i <= 16; i++)
{
Console.WriteLine(i);
int[] a = new int[i];
int[] b = new int[i];
for (int j = 0; j < i; j++)
b[j] = 1;
x(i, a, 0, b, 0);
}
Console.ReadKey();
}
static void x(int b, int[] a, int n, int[] e, int z)
{
if (b == n)
{
if (Eq(a, e))
{
for (int i = 0; i < b; i++)
{
if (i > 0) Console.Write(", ");
Console.Write("{0}*{1}", ToS(i, b), ToS(a[i], b));
}
Console.WriteLine();
}
}
else
{
int m = b < 5
? 5
: new List<int> {
n > 1
? new List<int> { 4 - n, 0 }.Max() + e[n]
: 99,
b + 2 - z + n
}.Min();
for (int i = 1; i <= m; i++)
{
a[n] = i;
int[] f = e.Clone() as int[];
foreach (char c in ToS(i, b))
{
f[ToI(c, b)]++;
}
if (Range(0, n).Any(j => f[j] > a[j])) continue;
x(b, a, n + 1, f, z + i);
}
}
}
static bool Eq(int[] a, int[] b)
{
if (a == null || b == null) return (a == b);
if (a.Length != b.Length) return false;
for (int i = 0; i < a.Length; i++)
if (a[i] != b[i]) return false;
return true;
}
static string ToS(int i, int b)
{
char[] c = ALNUM.ToCharArray();
var sb = new StringBuilder();
for (; i > 0; i /= b) sb.Insert(0, c[i % b]);
return sb.Length > 0 ? sb.ToString() : "0";
}
static int ToI(char c, int b)
{
return ALNUM.IndexOf(c);
}
static IEnumerable<int> Range(int s, int e)
{
for (int i = s; i <= e; i++) yield return i;
}
|




herumi
#4100()
Rating4/14=0.29
[ reply ]