JAVA(数独)

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

class Myframe extends JFrame {
public static Object obj = new Object();
public final static JTextField[][] filed = new JTextField[9][9];

public Myframe() {
	for (int a = 0; a < 9; a++) {
	 for (int b = 0; b < 9; b++) {
		filed[a][b] = new JTextField();
		filed[a][b].setText("");
	 }
	}
	JPanel jpan = new JPanel();
	jpan.setLayout(new GridLayout(9, 9));
	for (int a = 8; a > -1; a--) {
	 for (int b = 0; b < 9; b++) {
		jpan.add(filed[b][a]);
	 }
	}
	add(jpan, BorderLayout.CENTER);
	JPanel jpb = new JPanel();
	JButton button1 = new JButton("calc");
	JButton button2 = new JButton("close");
	jpb.add(button1); 
	jpb.add(button2);
	button1.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent event) {
	synchronized (obj) {
	 for (int a = 0; a < 9; a++) {
		for (int b3 = 0; b3 < 9; b3++) {
		 int pp = 0;
		 if (!(filed[a][b3].getText().trim().equals(""))) {
			pp = Integer.parseInt(filed[a][b3].getText()
					.trim());
			Calculate.b[a][b3] = pp;
		 }
		}
	}
	}
	synchronized (obj) {
		new Thread(new Calculate()).start();
	}
	}
	});
	button2.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent event) {
			System.exit(0);
		}
	});
	add(jpb, BorderLayout.SOUTH);
}
}

public class Sudoku {
public static void main(String[] args) {
	Myframe myf = new Myframe();
	myf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	myf.setTitle("sudoku");
	myf.setSize(500, 500);
	myf.setVisible(true);
}
}

class Calculate implements Runnable {
	public static boolean[][] boo = new boolean[9][9];
	public static int upRow = 0;
	public static int upColumn = 0;
	public static int[][] b = new int[9][9];

	public static void flyBack(boolean[][] judge, int row, int column) {
		int s = column * 9 + row;
		s--;
		int quotient = s / 9;
		int remainder = s % 9;
		if (judge[remainder][quotient]) {
			flyBack(judge, remainder, quotient);
		} else {
			upRow = remainder;
			upColumn = quotient;
		}
	}

  public static void arrayAdd(ArrayList<Integer> array, TreeSet<Integer> tree) {
	for (int z = 1; z < 10; z++) {
		boolean flag3 = true;
		Iterator<Integer> it = tree.iterator();
		while (it.hasNext()) {
			int b = it.next().intValue();
			if (z == b) {
				flag3 = false;
				break;
			}
		}
		if (flag3) {
			array.add(new Integer(z));
		}
		flag3 = true;
	}
	}

  public static ArrayList<Integer> assume(int row, int column) {
	ArrayList<Integer> array = new ArrayList<Integer>();
	TreeSet<Integer> tree = new TreeSet<Integer>();
	for (int a = 0; a < 9; a++) { 
		if (a != column && b[row][a] != 0) {
			tree.add(new Integer(b[row][a]));
		}
	}
	for (int c = 0; c < 9; c++) {
		if (c != row && b[c][column] != 0) {
			tree.add(new Integer(b[c][column]));
		}
	}
	for (int a = (row / 3) * 3; a < (row / 3 + 1) * 3; a++)
	{
	  for (int c = (column / 3) * 3; c < (column / 3 + 1) * 3; c++) {
		if ((!(a == row && c == column)) && b[a][c] != 0) {
			tree.add(new Integer(b[a][c]));
		}
	}
	}
	arrayAdd(array, tree);
	return array;
	}

  public void run() {
	int row = 0,column = 0; 
	boolean flag = true;
	for (int a = 0; a < 9; a++) {
	 for (int c = 0; c < 9; c++) {
		if (b[a][c] != 0) {
			boo[a][c] = true;
		} else {
			boo[a][c] = false;
		}
	}
	}
	ArrayList<Integer>[][] utilization = new ArrayList[9][9];
	while (column < 9) {
		if (flag == true) {
			row = 0;
		}
	while (row < 9) {
	if (b[row][column] == 0) {
	if (flag) {
		ArrayList<Integer> list = assume(row, column);
		utilization[row][column] = list;
	}
	if (utilization[row][column].isEmpty()) {
		flyBack(boo, row, column);
		row = upRow;
		column = upColumn;
		b[row][column] = 0;
		column--;
		flag = false;
		break;
	} else {
		b[row][column] = utilization[row][column].get(0);
		utilization[row][column].remove(0);
		flag = true;
		judge();
	}
	} else {
		flag = true;
	}
	row++;
	}
	column++;
  }
 }
  public void judge()
  {
	boolean r = true;
	for (int a1 = 0; a1 < 9; a1++) {
	  for (int b1 = 0; b1 < 9; b1++) {
		if (r == false) {
			break;
		}
		if (b[a1][b1] == 0) {
			r = false;
		}
	}
	}
	if (r) { 
	  for (int a1 = 0; a1 < 9; a1++) {
		for (int b1 = 0; b1 < 9; b1++) {
			Myframe.filed[a1][b1].setText(b[a1][b1]+ "");
		}
	}
	}
  }
}
### Java实现数独的算法示例 以下是基于回溯算法实现的一个完整的Java程序,用于求解数独问题。此代码会尝试填充空白单元格,并验证每一步是否满足数独规则。 #### 完整代码示例 ```java public class SudokuSolver { public static void solveSudoku(char[][] board) { if (board == null || board.length != 9 || board[0].length != 9) return; solve(board); } private static boolean solve(char[][] board) { for (int row = 0; row < board.length; row++) { for (int col = 0; col < board[row].length; col++) { if (board[row][col] == '.') { // 如果当前单元为空 for (char c = '1'; c <= '9'; c++) { // 尝试填入数字'1'到'9' if (isValid(board, row, col, c)) { // 验证当前位置是否合法 board[row][col] = c; // 填充数字 if (solve(board)) { // 继续递归解决剩余部分 return true; } else { board[row][col] = '.'; // 回溯,撤销上一次的选择 } } } return false; // 若无法找到合适的数字,则返回false表示失败 } } } return true; // 所有位置都已成功填充 } private static boolean isValid(char[][] board, int row, int col, char num) { // 检查行是否有重复 for (int i = 0; i < 9; i++) { if (board[row][i] == num) return false; } // 检查列是否有重复 for (int i = 0; i < 9; i++) { if (board[i][col] == num) return false; } // 检查3x3的小方块是否有重复 int boxRowStart = row - row % 3; int boxColStart = col - col % 3; for (int r = boxRowStart; r < boxRowStart + 3; r++) { for (int d = boxColStart; d < boxColStart + 3; d++) { if (board[r][d] == num) return false; } } return true; // 当前位置可以放置num } public static void main(String[] args) { char[][] board = { {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'} }; solveSudoku(board); System.out.println("Solution:"); for (char[] row : board) { for (char cell : row) { System.out.print(cell + " "); } System.out.println(); } } } ``` 上述代码实现了经典的数独求解器[^3]。它利用了回溯算法的核心思想——逐步试探并及时修正错误路径。`solveSudoku` 方法接收一个 `9x9` 的字符数组作为输入,其中 `'.'` 表示待填写的位置。通过调用辅助函数 `solve` 和 `isValid` 来完成整个求解过程。 --- ### 关键点解析 1. **合法性校验** 函数 `isValid` 负责检查给定数字是否可以在指定位置 `(row, col)` 上安全放置而不违反数独规则[^1]。具体来说,它分别检查所在行、列以及所属的 `3x3` 子网格是否存在冲突。 2. **回溯机制** 主体逻辑由 `solve` 函数驱动,在遇到空位时依次测试所有可能的候选值 (`'1'-'9'`) 并递归处理后续状态。如果某次选择导致无解,则立即撤消该操作(即恢复原状),从而继续探索其他可能性。 3. **边界条件** 初始阶段需确认传入矩阵尺寸正确;当遍历结束而未发现矛盾情况时表明找到了有效解答[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值