2016-07-11 7 views
1

正方形の行列を転置する(つまり、列と行を入れ替える)簡単な関数を書こうとしています。問題の機能は次のとおりです。Golangを使用して2D配列スライスの要素を入れ替えることができません

func Transpose(a [][]bool) { 
    for i := 0; i < len(a); i++ { 
     for j := 0; j < len(a[i]); j++ { 
      a[i][j], a[j][i] = a[j][i], a[i][j] 
     } 
    } 
} 

動作していないようです。私はそれはとは何かを持っていると信じて

*** 
* 
*** 

*** 
* 
*** 

:私はこの機能それは次のような出力を提供します

func TestTranspose(t *testing.T) { 
    a := make([][]bool, 3) 
    a[0] = []bool{true, true, true} 
    a[1] = []bool{false, true, false} 
    a[2] = []bool{true, true, true} 

    fmt.Println(BoolArrayViz(a)) 

    Transpose(a) 

    fmt.Println(BoolArrayViz(a)) 
} 

を実行した場合(BoolArrayVizは、単純に「*」falseの場合「」本当かのようにブール値を出力します)私がスライスを回っているという事実。どんな助けもありがとう!

+1

スライスには基本となる配列へのポインタが含まれているため、パラメータとして渡されたスライスを変更する関数は、その配列を変更します。詳細は、[スライス](https://blog.golang.org/go-slices-usage-and-internals)を参照してください。私は問題が転置論理があなたが期待していることをしていないと思う。ループの繰り返しごとにマトリックスを印刷すると役立ちます。 – Mark

答えて

2

あなたのトランスロジックが(アイデアを証明するためにスワップを使用していない)
この作業試験サンプルを参照してください、(あなたが二回それを転置)正しくありません:

package main 

import "fmt" 

func Transpose(a [][]bool) { 
    n := len(a) 
    b := make([][]bool, n) 
    for i := 0; i < n; i++ { 
     b[i] = make([]bool, n) 
     for j := 0; j < n; j++ { 
      b[i][j] = a[j][i] 
     } 
    } 
    copy(a, b) 
} 
func main() { 
    a := [][]bool{ 
     []bool{true, true, true}, 
     []bool{false, true, false}, 
     []bool{true, true, true}, 
    } 
    BoolArrayViz(a) 
    Transpose(a) 
    BoolArrayViz(a) 
} 

func BoolArrayViz(a [][]bool) { 
    n := len(a) 
    for i := 0; i < n; i++ { 
     for j := 0; j < n; j++ { 
      if a[i][j] { 
       fmt.Printf("*") 
      } else { 
       fmt.Printf(" ") 
      } 
     } 
     fmt.Println() 
    } 
    fmt.Println() 
} 

出力:

*** 
* 
*** 

* * 
*** 
* * 

スワップを使用しています(内部ループ、jは0の代わりにi + 1から開始する必要があります):

package main 

import "fmt" 

func Transpose(a [][]bool) { 
    n := len(a) 
    for i := 0; i < n; i++ { 
     for j := i + 1; j < n; j++ { 
      a[i][j], a[j][i] = a[j][i], a[i][j] 
     } 
    } 
} 
func main() { 
    a := [][]bool{ 
     []bool{true, true, true}, 
     []bool{false, true, false}, 
     []bool{true, true, true}, 
    } 
    BoolArrayViz(a) 
    Transpose(a) 
    BoolArrayViz(a) 
} 

func BoolArrayViz(a [][]bool) { 
    n := len(a) 
    for i := 0; i < n; i++ { 
     for j := 0; j < n; j++ { 
      if a[i][j] { 
       fmt.Printf("*") 
      } else { 
       fmt.Printf(" ") 
      } 
     } 
     fmt.Println() 
    } 
    fmt.Println() 
} 
+0

D'oh!素晴らしい詳細な説明に感謝します! –

1

転置機能が間違っています。それは、行列を転置してから転置することです。内側のループでj0の代わりにi + 1で開始する必要があります。

関連する問題