正しい文(クイズ)
Posted feedbacks - Java
引数で与えた数を基数としてパズルを解きます(引数を省略した場合は10進とします)。
2進から16進まで、同じロジックを用いて、実用的な時間で全ての解を求めるのに苦労しました。
2進から16進まで、同じロジックを用いて、実用的な時間で全ての解を求めるのに苦労しました。
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 | public class Sample {
private int[] numOfNum;
private int[] nums;
private int radix, radix2, tryMax;
public Sample(int radix) {
numOfNum = new int[radix];
nums = new int[radix];
this.radix = radix;
radix2 = radix * radix;
tryMax = 2 * radix;
}
private void set(int n) {
if (n == radix) {
System.out.print("この文は");
for (int i = 0; i < radix; i++) {
if (i > 0)
System.out.print(",");
System.out.print(Integer.toString(i, radix) + "が");
System.out.print(Integer.toString(numOfNum[i], radix) + "個");
}
System.out.println("あります");
return;
}
nums[n]++;
for (int i = 1; i <= tryMax; i++) {
numOfNum[n] = i;
nums[i % radix]++;
if (i >= radix)
nums[(i / radix) % radix]++;
if (i >= radix2)
nums[1]++;
if (check(n))
set(n + 1);
nums[i % radix]--;
if (i >= radix)
nums[(i / radix) % radix]--;
if (i >= radix2)
nums[1]--;
}
nums[n]--;
}
private boolean check(int n) {
int diff = 0;
for (int i = 0; i <= n; i++) {
if (numOfNum[i] < nums[i])
return false;
diff += numOfNum[i] - nums[i];
if (diff > 2 * (radix - (n + 1)))
return false;
}
return true;
}
public static void main(String[] args) {
Sample s = new Sample((args.length==0)?10:Integer.parseInt(args[0]));
s.set(0);
}
}
|


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