1 2 3
8 9 4
7 6 5
我设法编写了这个程序,但遇到了一个奇怪的错误。在第26行它给了我一个数组越界异常。
while (matrix[row, col] == 0 && col < matrix.GetLength(0) )
然而,如果我在循环内切换两个语句的顺序,异常就会消失?这是否意味着while循环中两个语句的顺序很重要?如果是这样,为什么呢?难道不应该是当两个语句都为真时执行循环,只要其中一个为假,无论哪个,就停止执行吗?以下是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SpiralMatrixN
{
class Program
{
static void Main(string[] args)
{
//prompt the user to enter n
Console.WriteLine("Enter the value of n");
int n = int.Parse(Console.ReadLine());
int[,] matrix = new int[n,n];
Console.Clear();
System.Console.SetWindowSize(100, 30);
int value = 1;
int col = 0;
int row = 0;
if (n>0 && n<21)
{
while(value <= n*n)
{
while (matrix[row, col] == 0 && col < matrix.GetLength(0) )
{
matrix[row, col++] = value;
value++;
}
col--;
row++;
while (row < matrix.GetLength(1) && matrix[row, col] == 0)
{
matrix[row++, col] = value;
value++;
}
row--;
col--;
while (col >= 0 && matrix[row, col] == 0 )
{
matrix[row, col--] = value;
value++;
}
col++;
row--;
while (matrix[row, col] == 0 && row >= 0)
{
matrix[row--, col] = value;
value++;
}
col++;
row++;
}
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.SetCursorPosition(j * 5, i * 2);
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
}
}
}
}
row
和col
的值是你所期望的。在代码中设置断点,确保循环的行为符合你的预期。 - dub styleecol < matrix.GetLength(1)
和row < matrix.GetLength(0)
。在您当前的代码中可以工作,因为两个维度都是“n”,但是如果您有一个不是正方形的矩阵,由于这个原因,您将会遇到问题。 - Erik