⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grid999.java

📁 数独的java实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				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 + -