2010-12-13 31 views
0

ねえ、 私のコードはスパイラル行列に値を設定しています。 行が列= のときはうまく動作しますが、違うときは最初のスパイラル曲げにエラーが発生します。 私はブレークポイントでデバッグしようとしましたが、間違ったものを見つけることができませんでした! 私のコードに関するいくつかの追加のヒント: bentCounterは、行または列がいっぱいになったときを探し、そうであればjをインクリメントして渦巻きを渦巻きます。 j ++の場合、配列BとCの次の要素が使用されるため、配列のインデックスp、qの方向が変更されます。 fillされた行の後ろにcolumnがあると、サブ行列はそのままになります。 m-; j = 3の場合、新しいスワールを開始するには無効にする必要があります。 十分にはっきりしていることを願っています!スパイラル行列アルゴリズムの問​​題

static void Main(string[] args) 
     { 
      //n - quantity of rows, m - quantity of columns 
      // p,q - references to current element of The Matrix A[][] 
      // p=1, q=3 ----> A[0][3] - the element of crossing first row and fourth column 

      int p = 0; 
      int q = 0; 
      int j = 0; 
      int a = 0; 
      int b = 0; 
      int bentCounter = 0; 

      a = int.Parse(Console.ReadLine()); 
      b = int.Parse(Console.ReadLine()); 

      int n = a; 
      int m = b; 
      int mn = m * n; 

      int [,] A = new int [a,b]; 
      int[] B = new int[] { 0, 1, 0, -1 }; 
      int[] C = new int[] { 1, 0, -1, 0 }; 

      for (int i = 0; i < mn ; i++) 
      { 
       bentCounter++; 
       if (bentCounter == n) {j++;} 
       if (bentCounter == m + n - 1) 
       { 
        if (j == 3) { j = -1; } 
        j++; 
        bentCounter = 0; 
        n--; m--; 
       } 

       A [p,q] = i; 
       p += B[j]; 
       q += C[j];        
      } 

      for (int r = 0; r < A.GetLength(0); r++) 
      { 
       for (int c = 0; c < A.GetLength(1); c++) 
       { 
        Console.Write(" " + A[r, c] + " "); 
       } 
       Console.WriteLine(); 
      } 

10倍ディメンションに間違った方法をインクリメントし、範囲外のつもり

+2

これは右、宿題のですか?あなたが投稿した他の質問を見て、CSコースのイントロで見られる問題と一致しています。あなたのTAと話したいことはありますか? – plinth

答えて

1

BRあなたの助けに感謝、迅速な解決策は丸いのでへint [,] A = new int [a,b]を変更するそれらを交換することである

int [,] A = new int [b,a]; 

とすべてが良いです;)

EDIT:また、この行をパッドthに変更しますE出力はあなた

if (bentCounter == m) { j++; }

if (bentCounter == n) { j++; }

次あなたはまた、変更することができます素敵な正方行列

Console.Write(" " + A[r, c].ToString().PadLeft(mn.ToString().Length, ' ')); 
+0

ありがとう! 私は彼らを間違った方法で増やしている理由を教えていただけますか? – kidwon

+0

ああ、オレは愚かな私は10倍多く持っている:) – kidwon

1

を与え、それが正常に動作する必要があります。その理由はあなたのBとCのプレフィックスがそのように構成されているからです。

0

お試しください:これは、ユーザーのための100%ダイナミックスパイラルマトリックスです。

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <table> 
      <tr> 
       <td>Total Row Column :</td> 
       <td> 
        <input type="text" runat="server" id="txtbox" style="width: 100px;" /></td> 
      </tr> 
      <tr> 
       <td >Starting No :</td> 
       <td> 
        <input type="text" runat="server" id="txtstartwith" style="width: 100px;" /></td> 
      </tr> 
      <tr> 
       <td colspan="2" style="text-align:center;"> 
        <asp:Button ID="Button1" runat="server" Text="Generate Spiral Matrix" OnClick="Button1_Click" /></td> 
      </tr> 
     </table> 
     <div id="divsp" runat="server"> 
     </div> 
    </form> 
</body> 
</html> 

protected void Button1_Click(object sender, EventArgs e) 
     { 
      divsp.InnerHtml = ""; 
      int ignoreMe; 
      bool successfullyParsed = int.TryParse(txtbox.Value, out ignoreMe); 
      if (successfullyParsed) 
      { 
       successfullyParsed = int.TryParse(txtstartwith.Value, out ignoreMe); 
       if (successfullyParsed) 
       { 
        // ... 
       } 
       else 
       { 
        txtstartwith.Value = "0"; 
       } 
      } 
      else 
      { 
       txtbox.Value = "0"; 
      } 

      if (txtbox.Value != "" && txtbox.Value != "0" && Convert.ToInt32(txtbox.Value) > 0 && txtstartwith.Value != "") 
      { 
       int N = Convert.ToInt32(txtbox.Value); 
       int row = N; 
       int column = N; 

       int[,] A = new int[N, N]; 
       int ele = N * N; 
       ele = ele + (Convert.ToInt32(txtstartwith.Value) - 1); 
       int no = Convert.ToInt32(txtstartwith.Value); 

       int a = 0; 
       int b = 0; 

       int bo = 0; 
       int le = 0; 

       int loopbreak = 0; 
       while (no <= ele) 
       { 
        for (; b < N; b++) 
        { 
         A[a, b] = no; 
         if (no == ele) 
         { 
          loopbreak = 1; 
          break; 
         } 
         else 
         { 
          no++; 
         } 

        } 
        if (loopbreak == 1) 
        { 
         break; 
        } 

        if (b == N) 
        { 
         b = N - 1; 
         for (; a < b; a++) 
         { 
          int i = a + 1; 

          A[i, b] = no; 
          if (no == ele) 
          { 
           loopbreak = 1; 
           break; 
          } 
          else 
          { 
           no++; 
          } 
         } 
        } 
        if (loopbreak == 1) 
        { 
         break; 
        } 
        if (a == N - 1) 
        { 
         for (; b > le; b--) 
         { 
          int i = b - 1; 
          A[a, i] = no; 
          if (no == ele) 
          { 
           loopbreak = 1; 
           break; 
          } 
          else 
          { 
           no++; 
          } 
         } 
        } 
        if (loopbreak == 1) 
        { 
         break; 
        } 
        if (a == N - 1 && b == bo) 
        { 
         for (; a > le + 1; a--) 
         { 
          int i = a - 1; 
          A[i, b] = no; 
          if (no == ele) 
          { 
           loopbreak = 1; 
           break; 
          } 
          else 
          { 
           no++; 
          } 
         } 
         b = b + 1; 
        } 
        N = N - 1; 
        bo = bo + 1; 
        le = le + 1; 
       } 
       StringBuilder str = new StringBuilder(); 


       str.Append("<table>"); 
       for (int m = 0; m < row; m++) 
       { 
        str.Append("<tr>"); 
        for (int k = 0; k < row; k++) 
        { 
         str.Append("<td style='padding:5px;text-align:center;'>" + A[m, k].ToString() + "</td>"); 
        } 
        str.Append("</tr>"); 
       } 
       str.Append("</table>"); 
       divsp.InnerHtml = str.ToString().Trim(); 
      } 
     } 
1

また、以下のコードは、所定のサイズのスパイラルマトリックスを作成する場合に役立ちます。

static void Main(string[] args) 
{ 
    Console.WriteLine("Enter dimension for spiral matrix:"); 
    int matrisDim = int.Parse(Console.ReadLine()); 

    int[,] matris = new int[matrisDim, matrisDim]; 
    matris.Initialize(); 

    int apsisIterator = 0, ordinatIterator = 0, sum = 1; 
    bool increment = true; 

    for (int i = 0; i < matrisDim; i++) 
    { 
     matris[apsisIterator, ordinatIterator] = sum; 
     if (increment) 
     { 
      while (apsisIterator + 1 < matrisDim && matris[apsisIterator + 1, ordinatIterator] == 0) 
       matris[++apsisIterator, ordinatIterator] = ++sum; 

      while (ordinatIterator + 1 < matrisDim && matris[apsisIterator, ordinatIterator + 1] == 0) 
       matris[apsisIterator, ++ordinatIterator] = ++sum; 
     } 
     else 
     { 
      while (apsisIterator > 0 && matris[apsisIterator - 1, ordinatIterator] == 0) 
       matris[--apsisIterator, ordinatIterator] = ++sum; 

      while (ordinatIterator > 0 && matris[apsisIterator, ordinatIterator - 1] == 0) 
       matris[apsisIterator, --ordinatIterator] = ++sum; 
     } 
     increment = !increment; 
    } 

    for (int i = 0; i < matrisDim; i++) 
    { 
     for (int j = 0; j < matrisDim; j++) 
      Console.Write(matris[j, i] + "\t"); 
     Console.WriteLine(); 
    } 
    Console.ReadKey(); 
} 

あなたもGithubの要旨でこのコードを見ることができます:Gist - C# Spiral Matrix