编程格子填数字的方法如下:
输入数据
输入一个 \( n \times n \) 的方格矩阵。
输入 \( n \times n \) 个整数,这些整数将被填入矩阵中。
初始化
将输入的 \( n \times n \) 个整数保存到数组 `a` 中。
计算这些整数的总和并除以 \( n \) 得到每个格子应填入的平均值 `sum`。
排序
将数组 `a` 中的 \( n \times n \) 个数按从小到大的顺序排列,以确保得到的可行解是字典序最小的。
递归填数
编写递归函数 `dfs(int x, int y)`,用于对方格 `(x, y)` 填写数字。
每个格子可以从 `a` 到 `a[n*n-1]` 中选择一个未填过的数 `a[i]`(`vis[i]=0` 表示 `a[i]` 可以填写)。
填写后,递归调用 `dfs(x, y+1)` 填写下一个格子(若 `y=n`,则递归调用的下一个格子为 `dfs(x+1, 1)`)。
剪枝
在每一行或每一列填写结束时,调用 `chkRow(int row)` 或 `chkCol(int col)` 函数判断这一行或这一列的和是否等于 `sum`。
如果不等于,则直接返回 0,无需继续搜索。
检查解的有效性
所有方格填写结束后,检查最后一行、最后一列和两条对角线的和是否都等于 `sum`。
如果都等于,则找到一个可行解,返回 1。
输出结果
输出每行每列每个对角线的和值 `s`。
输出填数方案矩阵。
这个方法通过递归和剪枝技术,确保找到所有可能的填数方案,并且输出字典序最小的解。