
本文详解如何将 8×8 棋盘的字符串坐标(如 "a1", "h8")一一对应转换为 1~64 的整数索引,并在遍历二维棋盘时同步填充一维整型数组,提供可运行示例与关键转换逻辑说明。
本文详解如何将 8×8 棋盘的字符串坐标(如 "a1", "h8")一一对应转换为 1~64 的整数索引,并在遍历二维棋盘时同步填充一维整型数组,提供可运行示例与关键转换逻辑说明。
在 Go 中实现字符串坐标(如国际象棋风格的 "A1"、"H8")到连续整数索引(1 到 64)的映射,核心在于解析字符串并建立确定性数学关系。由于棋盘是 8×8 矩阵,行用 'A'–'H' 表示(对应 0–7),列用 '1'–'8' 表示(对应 0–7),因此可将 "XY" 映射为:
index = (row × 8) + col + 1,其中 row = X - 'A',col = Y - '1' + 1 → 简化后即 int(s[0]-'A')*8 + int(s[1]-'0')(注意 '1' 的 ASCII 值为 49,'0' 为 48,故 s[1]-'0' 直接得数字 1~8)。
以下是一个完整、健壮的实现:
package main
import "fmt"
// toNumber 将形如 "A1" 的字符串坐标转为 1~64 的整数索引
// 要求输入长度为 2,首字符为 'A'–'H',次字符为 '1'–'8'
func toNumber(s string) int {
if len(s) != 2 {
panic("invalid coordinate length: expected 2 chars")
}
row := int(s[0] - 'A')
col := int(s[1] - '0') // '1'→49, '0'→48 → 得 1; '8'→56 → 得 8
if row 7 || col 8 {
panic("invalid coordinate range: row A-H, col 1-8")
}
return row*8 + col
}
func convert() {
var board [8][8]string
var change [64]int
k := 0
for i := 0; i <p>✅ <strong>关键要点说明:</strong> </p>
- 使用 s[0]-'A' 和 s[1]-'0' 进行 ASCII 差值计算,安全且高效,避免字符串解析开销;
- toNumber 函数加入基础校验(长度与取值范围),提升鲁棒性;
- 在双重循环中同步生成坐标字符串与填充 change 数组,确保顺序严格一致(行优先);
- 注意 change 索引 k 从 0 开始递增,而 toNumber 返回 1~64,符合自然编号习惯;
- 不推荐手动维护计数器 k++ 多次——应与内层循环绑定,避免逻辑错位。
该方案简洁、可读性强,适用于棋盘建模、索引映射、序列化/反序列化等场景,是 Go 中处理行列坐标与线性索引双向转换的典型实践。











