異性体の問題 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())


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です