プログラミングスキルチェックの問題を解く際に順列計算を行う場面が多くなった。
以下の記事を参考にさせていただきgolangで実装してみました。
順列の全探索をするプログラム(競技プログラミング向け)
@suzuki-navi 様ありがとうございます。
備忘録目的です。
type Cat struct {
id int
eat_time int
fuman int
}
(中略)
//呼び出し側
cats:=make([]Cat, N)
・・・中略:配列へのメンバ設定・・・
cat_len:=len(cats)
pat:=1
for {
sb:=""
i:=0
for i=0;i<cat_len;i++ {
sb+=fmt.Sprintf(" %d", cats[i]);
}
fmt.Printf("pattern %d\n",pat);
fmt.Println(sb);
if !nextPermutation(cats) {
break
}
pat++
}
(中略)
//順列を求める関数
//ここではStruct(Cat型)のSliceをidをキーに順列を求めています。
func nextPermutation(arr []Cat) bool {
len:=len(arr)
left:=len-2
for left >= 0 && arr[left].id >= arr[left+1].id {
left--
}
if left < 0 {
return false
}
right:=len-1
for arr[left].id >= arr[right].id {
right--
}
t:=arr[left]
arr[left]=arr[right]
arr[right]=t
left++
right=len-1
for left < right {
t:=arr[left]
arr[left]=arr[right]
arr[right]=t
left++
right--
}
return true;
}