0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

順列計算

Last updated at Posted at 2022-02-14

プログラミングスキルチェックの問題を解く際に順列計算を行う場面が多くなった。
以下の記事を参考にさせていただき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;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?