異性体の問題 counting isomers
改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング
アルゴリズム
異性体の問題 counting isomers
実行
Playground※但し時間がかかります。Command Lineが現実的です。
コード
let C = 17 let L = 2558 var size = [Int](repeating: 0, count: L) var length = [Int](repeating: 0, count: L) var count = [Int](repeating: 0, count: C + 1) func isomer() -> Bool { var n = 0 var len = 0 for i in 0..<L { len = length[i] + 1 if len > C / 2 { break } let si = size[i] + 1 if si + len > C { continue } for j in 0...i { let sj = si + size[j] if sj + len > C { continue } for k in 0...j { let sk = sj + size[k] if sk + len > C { continue } n = n + 1 if n >= L { return false } size[n] = sk length[n] = len } } } if len <= C / 2 { return false } for i in 0...n { let si = size[i] for j in 0...i { if length[i] != length[j] { continue } let sj = si + size[j] if sj > C { continue } count[sj] = count[sj] + 1 for k in 0...j { let sk = sj + size[k] + 1 if sk > C { continue } for h in 0...k { let sh = sk + size[h] if sh <= C { count[sh] = count[sh] + 1 } } } } } for i in 1...C { print("炭素原子が \(i) 個のものは \(count[i]) 種類") } return true } print(isomer())