【题目】
【思路】
根据所给条件模拟判断。
import java.io.*;
import java.lang.Math;
class Main{
static int N = 40;
public static boolean check(int [][]f, int n){
int t = n * n ;
//每行包含从1到N^2的每个数字,每个数字一次。
for(int i = 1; i <= t; i++){
boolean st [] = new boolean[ t + 1];
for(int j = 1; j <= t; j++){
if( f[i][j] > t || f[i][j] < 1) return false; //数据范围要合法
if( st[f[i][j]]) return false; //每个数字一次
st[f[i][j]] = true; //第一次出现时标记
}
}
//每列包含从1到N^2的每个数字,每个数字一次。
for(int i = 1; i <= t; i++){
boolean st [] = new boolean[ t + 1];
for(int j = 1; j <= t; j++){
if( f[j][i]>t || f[j][i] < 1) return false; //数据范围要合法
if( st[f[j][i]]) return false; //每个数字一次
st[f[j][i]] = true;
}
}
//每个子矩阵包含从1到N^2的每个数字,每个数字一次。
for(int i = 1; i <= t; i += n){
for(int j = 1; j <= t; j += n){
boolean []st = new boolean[t + 1];
//检查每一个小矩阵
for(int p = i; p < i + n; p++ ){
for(int q = j; q < j + n; q++){
if( f[p][q] < 1 || f[p][q] > t) return false;
if( st[f[p][q]] ) return false;
st[f[p][q]] = true;
}
}
}
}
return true;
}
public static void main(String args[])throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(bf.readLine());
int t = 1;
while( T -- >0 ){
int n = Integer.parseInt(bf.readLine());
int c = n*n;
int f[][] = new int [N][N];
for(int i = 1; i <= c; i++){
String s[] = bf.readLine().split(" ");
for(int j = 1; j <= c; j++){
f[i][j] = Integer.parseInt(s[ j - 1]);
}
}
if(check(f,n))
log.write("Case #"+t+": Yes\n");
else
log.write("Case #"+t+": No\n");
t ++;
}
log.flush();//要从缓冲区flush出去才会打印
log.close();
bf.close();
}
}