2017-09-13 11 views
2

私はこの課題に問題があります。私は四角形ではない螺線形の行列を印刷します。つまり、ユーザーは行と列の数を入力する必要があります。正方形でないスパイラルマトリックスが正しく印刷されない

 Console.Write("Enter n: "); 
     int n = int.Parse(Console.ReadLine()); 
     Console.Write("Enter m: "); 
     int m = int.Parse(Console.ReadLine()); 
     int[,] matrix = new int[n,m]; 
     int row = 0; 
     int col = 0; 
     string direction = "right"; 
     int maxRotations = n * m; 

     for (int i = 1; i <= maxRotations; i++) 
     { 
      if (direction == "right" && (col > n - 1 || matrix[row, col] != 0)) 
      { 
       direction = "down"; 
       col--; 
       row++; 
      } 
      if (direction == "down" && (row > n - 1 || matrix[row, col] != 0)) 
      { 
       direction = "left"; 
       row--; 
       col--; 
      } 
      if (direction == "left" && (col < 0 || matrix[row, col] != 0)) 
      { 
       direction = "up"; 
       col++; 
       row--; 
      } 

      if (direction == "up" && row < 0 || matrix[row, col] != 0) 
      { 
       direction = "right"; 
       row++; 
       col++; 
      } 

      matrix[row, col] = i; 

      if (direction == "right") 
      { 
       col++; 
      } 
      if (direction == "down") 
      { 
       row++; 
      } 
      if (direction == "left") 
      { 
       col--; 
      } 
      if (direction == "up") 
      { 
       row--; 
      } 
     } 

     // displej matrica 

     for (int r = 0; r < n; r++) 
     { 
      for (int c = 0; c < m ; c++) 
      { 
       Console.Write("{0,4}", matrix[r,c]); 
      } 
      Console.WriteLine(); 

     } 
     Console.ReadLine(); 
    } 

私の問題は現在、印刷されておらず、スパイラルで印刷されているということです。言い換えれば、スパイラルはちょっと混乱しています。 私は列の数としてコードを実行し、行数として4を入力し、6なら、私は、次を得る:

1 2 3 4 0 24 
12 13 14 5 0 23 
11 16 17 18 19 22 
10 9 8 7 20 21 

私は間違って何をしているのですか?私は "右"、あなたの境界はmあるべきために推測

if (direction == "right" && (col > n - 1 || matrix[row, col] != 0)) 
if (direction == "down" && (row > n - 1 || matrix[row, col] != 0)) 

+0

開始のために配列の中心から始まっていない –

+1

私は 'if(direction ==" right "&&(col> n - 1 ||行列[row、col]!= 0))' (方向の== "右" &&(col> m - 1 ||行列[行、col]!= 0)) '(** mの代わりにn **) – Fildor

+0

@YairHalberstadt私はらせんが起こっていると思う「内向き」ではなく「外向き」である。 – Fildor

答えて

0

あなたの最初の2つの条件が同じ境界(n)を確認してください。

if (direction == "right" && (col > m - 1 || matrix[row, col] != 0)) 

これが早期に「転換」している理由です.nは4です。それはまさに旋回しているところです。残りはすべてフォローアップエラーです。

+0

OPがn&mの代わりにr&cという名前を付けていれば、もっと明らかになっているかもしれません。 – spodger

+0

@ spodger実際、私は "r"と "c"を "n"と "m"の改善の多くとは考えていません。しかし、あなたは本当にvar名よりも恐ろしい戦いに陥ることができます。私が提案しなければならなかったら、私はそれらを "maxRow"と "maxCol"と命名したでしょう。しかし、それは私の個人的な味です。または、おそらく "幅"と "高さ" ... – Fildor

+1

それはそれです。大変ありがとうございます:) –

関連する問題