📄 grid999.java
字号:
tt2[i + 3][j] = B[j][i];
}
}
for (int i = 0; i < 9;) {
intT = (int) (Math.random() * 9 + 1);
if (sum++ > intSum) {
intT = 0;
i = 0;
sum = 0;
}
for (int j = 0; j < i; j++) {
if (intT == temp[j] && i != 0) {
intT = 0;
break;
}
}
if (intT != 0) {
for (int k = 0; k < 3; k++) {
if (i < 3) {
if (intT == tt2[0][k] || intT == tt2[i + 3][k]) {
intT = 0;
break;
}
} else if (i < 6) {
if (intT == tt2[1][k] || intT == tt2[i][k]) {
intT = 0;
break;
}
} else {
if (intT == tt2[2][k] || intT == tt2[i - 3][k]) {
intT = 0;
break;
}
}
}
if (intT != 0) {
temp[i] = intT;
i++;
}
}
}
// System.out.println(sum + " H");
H = getint1(temp);
// printInt(H);
}
// 生成数组 E
public void getE() {
intT = 0;
// 临时数组intTemp用于生成存储1-9个数字
int intTemp[] = new int[9];
for (int i = 0; i < 9; i++) {
intTemp[i] = i + 1;
}
// 生成判断的条件
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt3[i][j] = D[i][j];
tt3[i][j + 3] = F[i][j];
tt3[i + 3][j] = B[j][i];
tt3[i + 3][j + 3] = H[j][i];
}
}
for (int i = 0; i < 9;)
{
for (int j = 0; j < 9; j++) {
intT = intTemp[j];
if (intT == 0) {
continue;
}
// 循环判断条件数组
for (int k = 0; k < 6; k++) {
if (i < 3) {
if (intT == tt3[0][k] || intT == tt3[i + 3][k]) {
intT = 0;
break;
}
} else if (i < 6) {
if (intT == tt3[1][k] || intT == tt3[i][k]) {
intT = 0;
break;
}
} else if (i < 9) {
if (intT == tt3[2][k] || intT == tt3[i - 3][k]) {
intT = 0;
break;
}
}
}
// 判断是否符合条件
if (intT != 0) {
// 符合条件就赋值到数组 并将其标示为 0
temp[i] = intT;
intTemp[j] = 0;
// 做下一次循环
i++;
// 退出循环
break;
}
}
}
// System.out.println(sum + " E");
E = getint1(temp);
// printInt(E);
}
// 生成数组 I
public void getI() {
intT = 0;
// 同E
int intTemp[] = new int[9];
for (int i = 0; i < 9; i++) {
intTemp[i] = i + 1;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt3[i][j] = G[i][j];
tt3[i][j + 3] = H[i][j];
tt3[i + 3][j] = C[j][i];
tt3[i + 3][j + 3] = F[j][i];
}
}
for (int i = 0; i < 9;)
{
for (int j = 0; j < 9; j++) {
intT = intTemp[j];
if (intT == 0) {
continue;
}
for (int k = 0; k < 6; k++) {
if (i < 3) {
if (intT == tt3[0][k] || intT == tt3[i + 3][k]) {
intT = 0;
break;
}
} else if (i < 6) {
if (intT == tt3[1][k] || intT == tt3[i][k]) {
intT = 0;
break;
}
} else if (i < 9) {
if (intT == tt3[2][k] || intT == tt3[i - 3][k]) {
intT = 0;
break;
}
}
}
if (intT != 0) {
temp[i] = intT;
intTemp[j] = 0;
i++;
break;
}
}
}
// System.out.println(sum + " I");
I = getint1(temp);
// printInt(I);
}
// 判断生成的数组 F H 是否符合要求 直到得到数组 F H
public boolean getFH() {
// 判断标示值的数值是否大于特定值
if (FHsum > intSum) {
FHsum = 0;
// 如果成立就重新生成程序
mainTest1();
}
// 生成的数组用于存储标示值
intI1 = new int[3][3];
intI2 = new int[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt3[i][j] = G[i][j];
tt3[i][j + 3] = H[i][j];
tt3[i + 3][j] = C[j][i];
tt3[i + 3][j + 3] = F[j][i];
}
}
for (int k = 0; k < 3;) {
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (tt3[k][i] == tt3[3][j]) {
intI1[k][0]++;
} else if (tt3[k][i] == tt3[4][j]) {
intI1[k][1]++;
} else if (tt3[k][i] == tt3[5][j]) {
intI1[k][2]++;
}
}
}
// 判断标示值 均为4时 执行下次循环
// 判断值为4 是特定的条件
if (intI1[k][0] == 4 && intI1[k][1] == 4 && intI1[k][2] == 4) {
k++;
} else {
FHsum++;// 标示值自加
return false;
}
}
// 同上
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt3[i][j] = D[i][j];
tt3[i][j + 3] = F[i][j];
tt3[i + 3][j] = B[j][i];
tt3[i + 3][j + 3] = H[j][i];
}
}
for (int k = 0; k < 3;) {
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (tt3[k][i] == tt3[3][j]) {
intI2[k][0]++;
} else if (tt3[k][i] == tt3[4][j]) {
intI2[k][1]++;
} else if (tt3[k][i] == tt3[5][j]) {
intI2[k][2]++;
}
}
}
if (intI2[k][0] == 4 && intI2[k][1] == 4 && intI2[k][2] == 4) {
k++;
} else {
FHsum++;
return false;
}
}
return true;
}
// 程序的入口
public static void main(String[] args) {
// TODO 自动生成方法存根
new Grid999();
}
// 将一维数组转换为二维数组 横行
public int[][] getint1(int temp[]) { // 横行
int t[][] = new int[3][3];
int tnum = 0;
// 依次将一维数组的值赋值给二维数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
t[i][j] = temp[tnum++];
}
}
return t;
}
// 将一维数组转换为二维数组 竖行
public int[][] getint2(int temp[]) { // 纵行
int t[][] = new int[3][3];
int tnum = 0;
// 同getint1();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
t[j][i] = temp[tnum++];
}
}
return t;
}
// 打印特定的数组 用于测试时使用 或单独打印特定的区域的数组时 使用
public void printInt(int tt[][]) {
// 循环打印
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(tt[i][j]);
}
System.out.println();
}
}
// 打印全部的数组的值 按照一定的格式
public void printAll() {
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < A[i].length; j++) {
System.out.print(A[i][j] + " ");
}
for (int j = 0; j < B[i].length; j++) {
System.out.print(B[i][j] + " ");
}
for (int j = 0; j < C[i].length; j++) {
System.out.print(C[i][j] + " ");
}
System.out.println();
}
for (int i = 0; i < D.length; i++) {
for (int j = 0; j < D[i].length; j++) {
System.out.print(D[i][j] + " ");
}
for (int j = 0; j < E[i].length; j++) {
System.out.print(E[i][j] + " ");
}
for (int j = 0; j < F[i].length; j++) {
System.out.print(F[i][j] + " ");
}
System.out.println();
}
for (int i = 0; i < G.length; i++) {
for (int j = 0; j < G[i].length; j++) {
System.out.print(G[i][j] + " ");
}
for (int j = 0; j < H[i].length; j++) {
System.out.print(H[i][j] + " ");
}
for (int j = 0; j < I[i].length; j++) {
System.out.print(I[i][j] + " ");
}
System.out.println();
}
}
}
/**
* <pre>
生成条件的数组的思路:
一 纵向生成的数组: 使用方法getint1();
1>D 判断A的纵向的行的所有数字
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt1[i][j] = A[j][i];
}
}
即 tt1 数组中记录的数值 3行3列
2>G 判断A D 的纵向的行的所有数字
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt2[i][j] = A[j][i];
tt2[i + 3][j] = D[j][i];
}
}
即 tt2 数组中记录的数值 6行3列
二 横向生成的数组: 使用方法getint2();
1>B 判断A的横向的行的所有数字
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt1[i][j] = A[i][j];
}
}
即 tt1 数组中记录的数值 3行3列
2>C 判断A B 的横向的行的所有数字 F H 均和C相同
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt2[i][j] = A[i][j];
tt2[i + 3][j] = B[i][j];
}
}
即 tt2 数组中记录的数值 6行3列
3>E 判断D F 的横向的行的所有数字 并判断B H 的纵向的行的所有数字 I与其相同
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tt3[i][j] = D[i][j];
tt3[i][j + 3] = F[i][j];
tt3[i + 3][j] = B[j][i];
tt3[i + 3][j + 3] = H[j][i];
}
}
即 tt3 数组中记录的数值 6行6列
程序中的关键点:
1>生成的区域的顺序
2>生成不同的区域时的方法不同 注意区分
1.A
2.B D
3.C G
4.F H
5.E I
3>F H 数组的生成 即方法getFH()
4>条件均为4时 保证E I区域中的每个位置都只有唯一的值出现
每组6个数字 共12个 相同的值为4个 不同的值为4个 即8个
每个区域共9个数字 已经确定的数字8个 那么唯一的数字的位置就确定了
</pre>
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -