C#实现1-9一维数值到3x3二维数组坐标的正确映射方案
索引越界的根本原因
你原来的坐标计算逻辑存在两个边界错误:
- 当输入为3、6、9这类3的倍数时,
input % 3的返回值为0,减1后x坐标为-1,直接超出数组索引的合法范围(C#数组索引从0开始,合法值为0、1、2) - 整数除法没有做0基转换,输入9时
input/3结果为3,减1后y=2虽然合法,但搭配错误的x计算依然会触发异常。
正确坐标计算方法
1-9的输入是按行优先顺序对应3x3网格的,对应关系如下:
| 1(0,0) | 2(0,1) | 3(0,2) |
|---|---|---|
| 4(1,0) | 5(1,1) | 6(1,2) |
| 7(2,0) | 8(2,1) | 9(2,2) |
只需要先把1-9的输入值减1,转换为0-8的0基准序号,再分别计算行列坐标即可,代码如下:
int zeroBase = input - 1; // 行坐标y:整数除3得到0/1/2,对应三行 int y = zeroBase / 3; // 列坐标x:模3得到0/1/2,对应三列 int x = zeroBase % 3;
完整可运行代码
建议加上输入合法性校验,避免非法输入导致程序崩溃:
// 读取并校验输入 if (!int.TryParse(Console.ReadLine(), out int input) || input < 1 || input > 9) { Console.WriteLine("输入非法,请输入1-9范围内的整数"); return; } string[,] numbers = { { " ", " ", " " }, { " ", " ", " " }, { " ", " ", " " } }; // 计算坐标 int zeroBase = input - 1; int y = zeroBase / 3; int x = zeroBase % 3; // 修改对应位置值 numbers[y, x] = "x"; // 打印数组验证结果 for (int row = 0; row < numbers.GetLength(0); row++) { for (int col = 0; col < numbers.GetLength(1); col++) { Console.Write(numbers[row, col] + " "); } Console.WriteLine(); }
按以上逻辑计算,所有1-9的输入都能映射到合法索引位置,不会触发越界错误。
内容的提问来源于stack exchange,提问作者callumetheridge
相关产品推荐
相关产品推荐

