将网格按“棋盘”染色:如果 (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