将网格按“棋盘”染色:如果 (i+j) 为偶数,填 1;否则填 −1。
此方法时间复杂度 O(nm),空间仅需输出即可。
import sys
def solve():
    data = sys.stdin.read().split()
    t = int(data[0])
    idx = 1
    out = []
    for _ in range(t):
        n = int(data[idx]); m = int(data[idx+1])
        idx += 2
        for i in range(1, n+1):
            row = []
            for j in range(1, m+1):
                # 棋盘染色:(i+j)%2==0 -> 1,否则 -1
                x = 1 if ((i+j)&1)==0 else -1
                row.append(str(x))
            out.append(" ".join(row))
    sys.stdout.write("\n".join(out))
if __name__ == "__main__":
    solve()
import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(in.readLine().trim());
        StringBuilder sb = new StringBuilder();
        while (T-- > 0) {
            String[] sp = in.readLine().split(" ");
            int n = Integer.parseInt(sp[0]), m = Integer.parseInt(sp[1]);
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m; j++) {
                    // (i+j)%2==0 填 1,否则 -1
                    int x = ((i + j) % 2 == 0) ? 1 : -1;
                    sb.append(x).append(j < m ? ' ' : '\n');
                }
            }
        }
        System.out.print(sb);
    }
}
#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    cin >> T;
    while(T--){
        int n, m;
        cin >> n >> m;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                // 棋盘染色:(i+j)%2==0 -> 1,否则 -1
                int x = ((i + j) % 2 == 0 ? 1 : -1);
                cout << x << (j < m ? ' ' : '\n');
            }
        }
    }
    return 0;
}
        给定一个n行m列的网格,使用(i,j)表示第i行第j列的单元格,其中1≤i≤n,1≤j≤m;
最初所有单元格均为空,你需要在每个单元格填入一个非零整数,使得以下条件成立:任意的2×2子网格中,四个单元格内整数之和等于整个网格所有单元格内整数之和;
已知n×m为偶数,可证明必有解。
每个测试文件均包含多组测试数据。第一行输入一个整数T(1≤T≤104)代表数据组数,每组测试数据描述如下:
在一行上输入两个整数n,m(2≤n,m,n×m≤106),分别表示网格的行数和列数。
除此之外,保证单个测试文件的n×m之和不超过106。
对于每组测试数据,一共n行,第i行输出m个用空格分隔的非零整数ai,1,ai,2,...,ai,m(−5×103≤ai,j≤5×103)后的格。
如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性
输入
1
2 2
输出
1 3
5 7