九宫格
public void test(int n){
int[][] magic = new int[n][n];
int t_row = 0;
int t_col = 0;
int row = n - 1; //最后一行
int col = n / 2; //中间列
magic[row][col] = 1; //最后一行的中间位置设为1
int len = n*n+1;
for(int i=2; i<len; i++){
t_row = (row + 1) % n; //下一行,如果达到最后一行,再从前面开始
t_col = (col +1) % n; //下一列,如果到达最后一列,则从前面开始
if(magic[t_row][t_col] == 0){
row = t_row;
col = t_col;
} else {
//如果该位置已经使用了,则行数减少1,如果达到第一行了,再从最后一行开始
row = (row - 1 + n) % n;
}
magic[row][col] = i;
}
}
数独验证
public boolean test(int[][] tt){
int n = tt.length;
int tmp = 0;
int res_row = 0,res_col = 0,res_b = 0;
for(int i=0; i<n; i++){
res_row = 0;
res_col = 0;
res_b = 0;
for(int j=0; j<n; j++){
tmp = tt[i][j]; //按行进行验证
//当前的值和其他值进行与运算,结果为零,说明没有该数字
if((res_row & (1<<(tmp-1))) == 0){
//将当前值和其他值进行或运算,将结果保存下来
res_row = res_row | (1<<(tmp-1));
} else {
return false;
}
tmp = tt[j][i]; //按列进行验证
if((res_col & (1<<(tmp-1))) == 0){
res_col = res_col | (1<<(tmp-1));
} else {
return false;
}
//按照3*3的方阵进行验证
int idx_row = (i / 3) * 3 +( j / 3);
int idx_col = (i % 3) * 3 + (j % 3);
tmp = tt[idx_row][idx_col];
if((res_b & (1<<(tmp-1))) == 0){
res_b = res_b | (1<<(tmp-1));
} else {
return false;
}
}
}
return true;
}