
本文介绍如何将 8×8 棋盘的字符串坐标(如 "a1", "h8")高效、可逆地映射为唯一的整数索引(1 到 64),并通过一次遍历完成二维字符串数组到一维整数数组的转换。
本文介绍如何将 8×8 棋盘的字符串坐标(如 "a1", "h8")高效、可逆地映射为唯一的整数索引(1 到 64),并通过一次遍历完成二维字符串数组到一维整数数组的转换。
在国际象棋或类似棋盘建模场景中,常需将人类可读的坐标(如 "A1"、"H8")与程序内部使用的线性索引(如 1~64)建立一一对应关系。Go 语言中可通过字符算术运算实现无哈希、无查找表的 O(1) 映射。
核心映射逻辑基于坐标编码规则:
- 行字母 'A'–'H' 对应 0–7,即 row = s[0] - 'A'
- 列数字 '1'–'8' 对应 0–7(注意 '1' 的 ASCII 是 49,需减 '0' 得 1,再减 1 得 0),即 col = s[1] - '0' - 1
- 线性索引 = row × 8 + col + 1(+1 实现 1-based 编号)
因此,转换函数简洁明了:
func toNumber(s string) int {
if len(s) != 2 {
panic("invalid coordinate: length must be 2")
}
row := int(s[0] - 'A')
col := int(s[1] - '0') - 1 // '1' → 0, '2' → 1, ..., '8' → 7
return row*8 + col + 1
}
在 convert() 函数中,我们同步构建棋盘字符串数组并填充整数映射数组,避免二次遍历:
func convert() {
var board [8][8]string
var change [64]int
k := 0
for i := 0; i <p>✅ <strong>关键注意事项</strong>: </p>
- 字符串长度必须严格为 2,否则 s[0] 或 s[1] 可能 panic;生产环境建议用 strings.TrimSpace() 和范围校验增强鲁棒性;
- '1' 的 ASCII 值为 49,'0' 为 48,故 s[1] - '0' 得到的是数值 1~8,需再减 1 才得到列偏移 0~7;
- 映射公式 row×8 + col + 1 确保 "A1"→1、"H8"→64,符合常规棋盘编号习惯;
- 使用 [64]int 和 [8][8]string 固定大小数组可提升性能,但若需动态扩展,应改用切片([]int, [][]string)并配合 make 初始化。
该方案兼具可读性、效率与可逆性——反向映射(整数 → 坐标)同样简单:row = (n-1)/8, col = (n-1)%8, 再组合为 string('A'+row) + string('1'+col)。











