在下面的代码中我想实现floyd算法,用户在文本框中输入一些数字,输出应该是从节点i到节点j的最短距离。但是当我输入例如4个数字时,它给出运行时间错误:超出我在下面评论过的行的范围,并且我调试了它,我理解k,我只取1个值并且不取另一个小于n + 1的值但j可以取所有小于n +的值1,我能解决这个问题吗?非常感谢
编辑: 谢谢你的答案我纠正了
private void button10_Click(object sender, EventArgs e)
{
string ab = textBox11.Text;
int matrixDimention = Convert.ToInt32(ab);
int[,] intValues = new int[matrixDimention, matrixDimention];
string[] splitValues = textBox9.Text.Split(',');
for (int i = 0; i < splitValues.Length; i++)
intValues[i / (matrixDimention), i % (matrixDimention)] = Convert.ToInt32(splitValues[i]);
string displayString = "";
for (int inner = 0; inner < intValues.GetLength(0); inner++)
{
for (int outer = 0; outer < intValues.GetLength(0); outer++)
displayString += String.Format("{0}\t", intValues[inner, outer]);
displayString += Environment.NewLine;
}
int n=matrixDimension
MessageBox.Show("matrix"+strn+ "in" + strn + "is\n\n\n" +displayString);
////before this line i wrote the codes to get the numbers that user enter in textbox and put it in an 2d array
for (int k = 0; k < n; k++)/// k just take 1 in debugging!!!
for (int i = 0; i < n; i++)///i just take 1 in debugging!!!
for (int j = 0; j < n; j++)///j took the values true
/*i took that error on this line */ if (intValues[i, j] > intValues[i, k] + intValues[k, j])
{
intValues[i, j] = intValues[i, k] + intValues[k, j];
string str_intvalues = intValues[i, j].ToString();
MessageBox.Show("Shortest Path from i to j is: " + str_intvalues);
}
else
{
string str_intvalues = intValues[i, j].ToString();
MessageBox.Show("Shortest Path from i to j is: " + str_intvalues);
}
}
答案 0 :(得分:2)
大多数编程语言,包括C#,都从位置0开始计算数组单元格。
这意味着如果您有一个大小为N的数组,则会得到从0到N-1的索引。
所以你的循环应该是这样的:
for (int j = 0; j < n; j++)
AND,当我再次查看代码时,我意识到你intValues
是一个2D矩阵,每边的大小为matrixDimention
。但是n
的大小(int)Math.Pow(matrixDimention,2)。
因此,如果您在k通过intValues
时尝试访问matrixDimention
,那么您将会超出界限。
答案 1 :(得分:2)
你的matrixDimention用于初始化intValues,但你使用int n = (int)Math.Pow(matrixDimention, 2);
迭代矩阵,你应该在for循环中使用matrixDimention:
for (int k = 0; k < matrixDimention; k++)
...